【问题标题】:Getting invalid_grant when trying to refresh token尝试刷新令牌时获取 invalid_grant
【发布时间】:2013-06-11 00:21:46
【问题描述】:

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

背景:

  • 使用oauth2client 模块进行身份验证和OAuth2Credential 对象。
  • 像 Google 自己的示例代码一样将 OAuth2Credential 对象腌制和 base64 存储到数据库中
  • 使用apiclient 模块调用镜像API
  • 此代码在 3 个不同的服务器上运行,在尝试发送时都出现相同的问题
  • 我要求的范围是"https://www.googleapis.com/auth/glass.timeline" 和"https://www.googleapis.com/auth/userinfo.profile"
  • 我可以确认 access_type 设置为“离线”
  • 我要求将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。此时,凭证就跟废话一样了,因为access_token已经过期,refresh_token只会报同样的错误。

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

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

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

【问题讨论】:

  • 您能否确认即使用户没有撤​​销访问权限,您也会收到此错误?通常,当用户通过在 MyGlass 中关闭 Glassware 或转到他们的帐户页面并撤销令牌来撤销访问权限时,就会发生此错误。
  • 刚刚收到用户关闭它的消息。这会永久撤消访问权限还是只是在关闭时暂时撤消?
  • 这将永久撤销访问权限。用户需要再次通过授权流程才能为您提供一组新的 OAuth 2.0 凭据。
  • 谢谢,现在这很有意义,您可以将其发布为答案。这是否可以记录在开发者网站上,说明 MyGlass 切换等同于从帐户页面撤销访问权限?

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


【解决方案1】:

来自评论线程的回答:用户从 MyGlass 网站关闭了 Glassware,导致令牌被撤销。

用户需要再次通过授权流程才能使用 Glassware,方法是访问 Glassware 授权端点或在 MyGlass 上将其重新“打开”(如果可用)。

【讨论】:

  • 您是否有一段我可以放入示例项目中的代码,它可以检测令牌何时被撤销并再次重定向到身份验证页面?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-04
  • 2021-09-11
  • 2021-11-07
  • 1970-01-01
  • 2015-12-08
  • 1970-01-01
  • 2020-06-09
相关资源
最近更新 更多