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

Java 从刷新令牌获取访问令牌失败,出现无效的\u grant错误,错误请求或令牌已过期或被撤销,错误描述如下,java,http,oauth,google-oauth,scribe,Java,Http,Oauth,Google Oauth,Scribe,使用Java OAuth2客户端库:scribe 1.2.0() 我能够从授权码中获取刷新令牌(即,通过使用客户端id、客户端机密、代码、范围、授权类型(授权码)、重定向uri参数对进行POST调用)。我已经将刷新令牌保存在DB中。 我们支持驱动器和日历范围=>因此,我确实为每个用户(电子邮件)存储两个刷新令牌 然后客户端将调用API来获取访问令牌(然后我使用刷新令牌、授权类型(刷新令牌)、客户端id和客户端机密对进行POST调用)。通话成功。即;快乐的正常路径是有效的 但最终从刷新令牌获取新的

使用Java OAuth2客户端库:scribe 1.2.0()

我能够从授权码中获取刷新令牌(即,通过使用客户端id、客户端机密、代码、范围、授权类型(授权码)、重定向uri参数对进行POST调用)。我已经将刷新令牌保存在DB中。 我们支持驱动器和日历范围=>因此,我确实为每个用户(电子邮件)存储两个刷新令牌

然后客户端将调用API来获取访问令牌(然后我使用刷新令牌、授权类型(刷新令牌)、客户端id和客户端机密对进行POST调用)。通话成功。即;快乐的正常路径是有效的

但最终从刷新令牌获取新的访问令牌失败,错误代码为无效。\u grant(错误代码为错误请求或令牌已过期或被撤销)(如在2天或3天内等)

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

问题

  • 既然刷新令牌应该是持久令牌,为什么我的应用程序不能从刷新令牌中获取新的访问令牌?它只是在2到3天的时间里失败了,而且在舞台和制作环境中经常发生

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

  • 回答 终于能够解决它了,请看下面的评论-它与为不同的作用域使用相同电子邮件的两个刷新令牌相关,并使其中一个无效

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

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

    有关问题:

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

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

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

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

    未完成刷新令牌的最大数量。
    当用户使用脱机访问授权您的应用程序时,您将获得一个刷新令牌,如果用户再次授权您的应用程序,您将获得另一个刷新令牌。您可以继续这样做多达50次,所有50个刷新令牌将继续工作。一旦你过了50这个神奇的数字,那么第一个被创建的数字就会过期。这就是为什么必须确保始终在数据库中存储用户的最新刷新令牌。

    基本上,问题如下:

    场景:同一封电子邮件有两个不同作用域(比如驱动器和日历)的刷新令牌

  • 获取刷新令牌-例如驱动器作用域
  • 为同一封电子邮件获取另一个刷新令牌-比如日历范围(请注意,Goole现在会合并此刷新令牌的范围,即使我们仅请求日历-即刷新令牌同时具有驱动器和日历范围-因为同一应用程序已在#1中授予驱动器访问权限)
  • 使日历的刷新令牌无效
  • 谷歌的失效行为 谷歌还宣布#1的刷新令牌无效(谷歌硬盘也是如此)——可能是出于安全原因,他们故意这么做的


    i、 e;这两个令牌都被吊销。

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