当OAuth2Credential对象尝试刷新其access_token时,有时会出现invalid_grant错误,然后无法刷新。我使用的代码基于Google的python API和Mirror API示例。
背景:
oauth2client
模块进行身份验证和OAuth2Credential对象。apiclient
模块调用Mirror API "https://www.googleapis.com/auth/glass.timeline"
和"https://www.googleapis.com/auth/userinfo.profile"
以下是用于调用镜像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的离线。我也无法通知用户他们需要重新授权。
答案 0 :(得分:1)
评论主题回答:用户从MyGlass网站切换了玻璃器皿,导致令牌被撤销。
用户需要再次通过授权流程才能通过访问Glassware授权终端或在MyGlass上“打开”切换它来使用Glassware。