当前位置: 首页 > 知识库问答 >
问题:

从刷新令牌获取访问令牌失败,出现无效的_grant错误,错误请求或令牌已过期或被撤销,错误描述如下

夏振国
2023-03-14

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

我可以从授权码中获取刷新令牌(即,通过向https://accounts.google.com/o/oauth2/token使用客户机id、客户机机密、代码、范围、授权类型(授权代码)、重定向uri参数)。我将刷新令牌保存在DB中。我们还支持驱动器和日历范围=

然后客户端将调用API来获取访问令牌(然后我用refresh_token、grant_type(refresh_token)、client_id和client_secrethttps://accounts.google.com/o/oauth2/token进行POST调用)。电话是成功的。也就是说;快乐的正常道路起作用了。

但最终从刷新令牌获取新的访问令牌失败,错误代码无效(错误请求或令牌已过期或因错误而吊销)(如2天或3天内等)

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

问题

>

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

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

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

    正在从刷新令牌获取访问令牌-邮递员

    正在从授权代码获取刷新令牌-邮递员

    Rel事件问题:谷歌令牌刷新返回“令牌已过期或吊销”由于几天刷新令牌已自动过期

  • 共有2个答案

    焦兴为
    2023-03-14

    基本上,如果你的应用程序为同一个用户(Gmail)使用了多个不同作用域的刷新令牌,则使其中一个失效将使所有令牌失效。

    这是一个问题,因为我们根据范围(如驱动器、日历、联系人等)维护不同的刷新令牌

    程天佑
    2023-03-14

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

    如果用户通过他们的谷歌账户直接撤销你的访问权限,这也将撤销你的刷新令牌。

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

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

    当用户使用离线访问授权您的应用程序时,您将获得一个刷新令牌,如果用户再次授权您的应用程序,您将获得另一个刷新令牌。你可以继续这样做50次,所有50个刷新令牌将继续工作。一旦你过了50这个神奇的数字,那么第一个被创造的数字就会过期。这就是为什么确保始终在数据库中存储用户的最新刷新令牌非常重要。

     类似资料:
    • 我目前正在开发一个简单的Spring Boot应用程序,在该应用程序中,我传递client_id和secret以获得访问令牌,从而获得一个刷新和访问令牌。 但是,当我尝试使用该令牌访问资源(我的REST API)时(具有以下URL:curl-h“authorization:Bearer ead8ba5d-88ad-4531-a821-db08bf25e888”localhost:8081/my-e

    • 我正在尝试从访问代码中获取访问令牌。但存在 400 错误请求错误的错误 我正在使用此链接获取访问代码 https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 响应此链接,我正在获取查询字符串中的代码,返回 URL 代码=Mh12d04c8

    • 我在Note.js项目中完美地使用了azure API。 登录: 最后一行抛出错误: 访问令牌丢失或格式错误

    • 目前访问类型处于联机状态。当我需要访问驱动器上的文件/文件夹时,我将浏览器重定向到Google URL并获得访问代码: 一切运转良好!但我只需要第一次重定向。 当我谷歌时,在google Drive API文档中,我发现我可以通过浏览器重定向获得刷新令牌,并将其保存在数据库中。(换句话说,我可以使用脱机访问)。 而且每次当我需要从google drive读取数据时,我使用刷新令牌获得访问令牌,而无

    • 2016年,我在我的谷歌开发者控制台账户上创建了一个应用 这是因为访问令牌或刷新令牌在2016年后的今天过期了吗?我应该尝试从google开发者控制台重置客户端密码吗? 编辑——下面是我正在使用的代码