尝试刷新令牌时获取invalid_grant

时间:2013-06-05 18:32:22

标签: python google-oauth google-mirror-api

当OAuth2Credential对象尝试刷新其access_token时,有时会出现invalid_grant错误,然后无法刷新。我使用的代码基于Google的python API和Mirror API示例。

背景:

  • 使用oauth2client模块进行身份验证和OAuth2Credential对象。
  • 将腌制的OAuth2Credential对象和base64'd存储到数据库中,如Google自己的示例代码
  • 使用apiclient模块调用Mirror API
  • 此代码在3台不同的服务器上运行,在尝试发送时都显示相同的问题
  • 我要求的范围是"https://www.googleapis.com/auth/glass.timeline""https://www.googleapis.com/auth/userinfo.profile"
  • 我可以确认access_type设置为“offline”
  • 为了以防万一,我要求approval_prompt成为“强制”

以下是用于调用镜像API的代码:

from apiclient.discovery import build
http = credential.authorize(http=httplib2.Http())
service = build("mirror", "v1", http=http)
payload = <JSON_PAYLOAD_HERE>
service.timeline().insert(body=payload).execute()

当调用该服务时,它有可能发出401,这意味着需要刷新access_token。然后它调用刷新方法,该方法除了AccessTokenRefreshError,错误为 invalid_grant 。此时,凭证与bunk一样好,因为access_token已过期,而refresh_token只会产生相同的错误。

我看过有网页说这可能是由于NTP问题造成的,但我已确认(甚至切换NTP服务器)我的服务器同步。另一个记录的可能性是,在它们被回收之前只能存在25个刷新令牌,但是我在Credential对象上实现了store()方法,因此在刷新时,新凭据会保存到位(我可以确认这是有效的)因为我在数据库刷新时会看到新信息。)

由于我无法获得用户的凭据以按需开始展示此问题,因此除了“等待一段时间”之外,我无法解释重新创建问题的任何其他条件。我已经看到问题在认证和发送一个电话后很快就会发生,一百个电话后一直到一周的时间。

现在解决问题的唯一方法是让用户重新授权,但这不是解决方案,因为我希望在没有用户交互的情况下使用api的离线。我也无法通知用户他们需要重新授权。

1 个答案:

答案 0 :(得分:1)

评论主题回答:用户从MyGlass网站切换了玻璃器皿,导致令牌被撤销。

用户需要再次通过授权流程才能通过访问Glassware授权终端或在MyGlass上“打开”切换它来使用Glassware。