java - 从刷新令牌获取访问令牌失败并出现 invalid_grant 错误,并且错误请求或令牌已过期或作为错误描述被撤销
问题描述
使用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错误代码(错误请求或令牌已过期或被撤销为错误)(如 2 天或 3 天等)
请注意,刷新令牌不会被用户或代码显式撤销或无效。密码未更改。代码没有改变。客户 ID 和机密没有改变。我有点迷路了。
问题
由于刷新令牌应该是一个持久令牌,为什么我的应用程序无法从刷新令牌中获取新的访问令牌?它只是在2 到 3天内就失败了——而且它在舞台和生产环境中经常发生。
是否根据范围(驱动器和日历)存储两个刷新令牌 - 每个用户(电子邮件)问题(即;一旦发出第二个刷新令牌,前一个刷新令牌就会过期)?[不应该是这样- 我知道每个用户和客户端,每个用户对所有客户端都有限制。但是,2 太低,无法达到该限制。]
答案 终于能够解决它,请参阅下面的评论答案 - 它与为不同范围拥有两个相同电子邮件的刷新令牌有关,并使其中一个无效。
从刷新令牌获取访问令牌 - PostMan
从授权码获取刷新令牌 - PostMan
解决方案
更改密码
您的刷新令牌可能会过期有多种原因。我们可以锁定的第一个原因是,如果您使用的是 gmail 范围,用户更改了密码,并且用户更改了密码,这将导致所有未完成的刷新令牌过期。
用户撤销访问
如果用户直接通过他们的 Google 帐户撤销您的访问权限,这也将撤销您的刷新令牌。
申请状态。
现在你的应用还在谷歌云控制台上测试吗?您是否已将其移至已发布,是否已通过验证过程?如果不是,那么您的刷新令牌可能会在大约两周后到期,尽管时间框架可能已经改变,因为这似乎是谷歌过去几个月一直在努力的事情,并且没有官方消息。
刷新访问令牌提供刷新令牌。
实际上可能是这种情况的另一个原因是,当您刷新访问令牌时,它是否会返回一个新的刷新令牌。有时我会这样做。始终检查这是否与您之前使用的刷新令牌相同,如果注意则它是一个新令牌,您应该存储新令牌。有关原因的更多信息,请参阅下一点。
未完成的刷新令牌的最大数量。
当用户使用离线访问授权您的应用程序时,您将获得一个刷新令牌,如果用户再次授权您的应用程序,您将获得另一个刷新令牌。您最多可以继续执行此操作 50 次,所有 50 个刷新令牌都将继续工作。一旦您超过 50 的幻数,那么创建的第一个将过期。这就是为什么确保始终在数据库中存储用户的最新刷新令牌很重要的原因。
推荐阅读
- java - 不要在 csv 导入时在空间上拆分字符串
- android - Ionic 4 / Angular 7 app *randomly* 不渲染组件的一部分(android build)
- python - 如何在 python 3 中正确使用 super().__init__()?
- java - 如何将 javax.persistence.criteria.* 类添加到 Quarkus 中的 Jandex 索引?
- python - __name__="__main__" 内部或外部有什么不同?
- c# - 我无法让 Razor 语句在 MVC 的视图中呈现“UserOnProjectInRole”
- node.js - 使用 react-native-image-crop-picker 上传 React-Native axios 图像
- docker - 如何在 Docker API 中使用挂载创建容器
- angular - 是否可以在微信小程序中使用现有的 PWA?
- c# - C# MongoDB 2. 查找比较其字段的文档:不支持的过滤器