【问题标题】:Getting access token from refresh token failing with invalid_grant error, and Bad Request OR Token has been expired or revoked as error description从刷新令牌获取访问令牌失败并出现 invalid_grant 错误,并且错误请求或令牌已过期或作为错误描述被撤销
【发布时间】:2021-08-10 08:49:29
【问题描述】:

使用 Java OAuth2 客户端库:scribe 1.2.0 (https://github.com/scribejava/scribejava)

我能够从授权代码中获取刷新令牌(即,通过使用 client_id、client_secret、code、scope、grant_type (authorization_code)、redirect_uri 参数对 https://accounts.google.com/o/oauth2/token 进行 POST 调用)。而且我已经在数据库中保留了刷新令牌。 而且我们支持驱动器和日历范围 => 所以,我确实为每个用户存储了 两个刷新令牌(电子邮件)

然后客户端将调用 API 以获取访问令牌(然后我使用 refresh_token、grant_type (refresh_token)、client_id 和 client_secret 对 https://accounts.google.com/o/oauth2/token 进行 POST 调用)。并且通话成功。 IE;快乐的正常路径有效。

但最终从刷新令牌获取新访问令牌失败并出现 invalid_grant 错误代码(带有 Bad Request令牌已过期或撤销作为错误)(如 2 天或 3 天等)

请注意,刷新令牌不会被用户或代码显式撤销或无效。密码未更改。代码没有改变。客户 ID 和机密没有改变。我有点迷路了。

问题

  1. 既然刷新令牌应该是一个持久令牌,为什么我的应用程序无法从刷新令牌中获取新的访问令牌?它只是在 2 到 3 天内失败 - 而且它在舞台和生产环境中经常发生。

  2. 是否基于范围(驱动器和日历)存储两个刷新令牌 - 每个用户(电子邮件)问题(即;一旦发出第二个刷新令牌,前一个刷新令牌就会过期)? [不应该如此 - 我知道每个用户和客户端以及所有客户端的每个用户都有限制。但是,2 太低,无法达到该限制。]

回答 终于能够解决它,请参阅下面的评论答案 - 它与为不同范围拥有两个相同电子邮件的刷新令牌有关,并使其中一个无效。

从刷新令牌获取访问令牌 - PostMan

从授权码获取刷新令牌 - PostMan

相关问题:Google token refresh returns "Token has been expired or revoked." Since couple of days Refresh token has been automatically expired

【问题讨论】:

  • 我希望 link 对你有用。
  • 我想你需要将这些值作为请求参数。
  • @VivekJain - 这是来自邮递员的快照,并且传递参数作为 POST 请求的有效负载正在工作。我能够为我的开发环境获取访问令牌。

标签: java http oauth google-oauth scribe


【解决方案1】:

更改密码

您的刷新令牌可能会过期有多种原因。我们可以锁定的第一个原因是,如果您使用的是 gmail 范围,用户更改了密码并且用户更改了密码,这将导致所有未完成的刷新令牌过期。

用户撤销了访问权限

如果用户直接通过他们的 Google 帐户撤销您的访问权限,这也会撤销您的刷新令牌。

申请状态。

现在您的应用还在 Google 云控制台上进行测试吗?您是否已将其移至已发布,是否已通过验证过程?如果不是,那么您的刷新令牌可能会在大约两周后过期,尽管时间框架可能已经改变,因为这似乎是谷歌过去几个月一直在努力的事情,并且没有官方消息。

刷新访问令牌给出刷新令牌。

实际上可能是这种情况的另一个原因是,当您刷新访问令牌时,它是否会返回一个新的刷新令牌。有时我会这样做。始终检查这是否与您之前使用的刷新令牌相同,如果注意那么它是一个新令牌,您应该存储新令牌。有关原因的更多信息,请参阅下一点。

未完成刷新令牌的最大数量。

当用户使用离线访问授权您的应用程序时,您将获得一个刷新令牌,如果用户再次授权您的应用程序,您将获得另一个刷新令牌。您最多可以继续执行此操作 50 次,所有 50 个刷新令牌都将继续工作。一旦您超过 50 的幻数,那么创建的第一个将过期。这就是为什么确保您始终在数据库中存储用户的最新刷新令牌很重要的原因。

【讨论】:

    【解决方案2】:

    基本上,如果您的应用为同一用户 (Gmail) 有多个不同范围的刷新令牌,使其中一个无效将使所有令牌无效。

    事实证明这是问题所在,因为我们根据范围(例如驱动器、日历、联系人等)维护不同的刷新令牌

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-10
      • 2017-03-06
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      • 2020-11-06
      • 2017-12-12
      相关资源
      最近更新 更多