刷新 OAuth2 访问令牌的正确范例

Posted

技术标签:

【中文标题】刷新 OAuth2 访问令牌的正确范例【英文标题】:Proper paradigm for refreshing OAuth2 access token 【发布时间】:2012-08-23 03:08:16 【问题描述】:

我正在使用一个使用 OAuth2 的 API,它提供了一个在 3600 秒后过期的访问令牌,并提供了一个刷新令牌。最初,我等待 API 调用以表明访问令牌已过期的方式失败,然后尝试使用刷新令牌刷新访问令牌。当访问令牌过期并且同时进行多个 API 调用(每个调用单独触发刷新并且大多数调用失败)时,这会成为问题。

3600 秒后使用刷新令牌自动刷新访问令牌会更好吗? (或者 3599 秒还是 3601 秒?)我应该使用不同的范例来刷新访问令牌吗?

【问题讨论】:

【参考方案1】:

理想情况下,客户端应该有足够的智能来不使用过期的访问令牌。幸运的是,来自 OAuth AS 令牌端点的响应应该包含 expires_in 属性,以确认到期时间为 3600 秒。例如:

"token_type":"Bearer","expires_in":3600,"refresh_token":"p8BPdo01kkjh6fhatclD3wwBEQblm4kL4ctYRVlrHo","access_token":"9XebAAXeu6hQOAiwmOk8vdhRyUFV"

由于此 JSON 响应是由服务器生成的,因此传输回客户端可能需要一些时间,因此“expires_in”值可能比它看起来的要小。

鉴于此,我建议您在到期前有某种缓冲区(例如 5-10 秒),以自动使用您的刷新令牌来请求新的访问令牌。

【讨论】:

所以我实际上应该在(expires_in - 5)(expires_in - 10) 秒左右之后自动刷新? 我推荐这种方法是的 - 考虑到客户已经拥有的信息,客户当然有机会这样做。 但是在OP的多个并发请求的场景中,只要新的token被请求,旧的token就失效了,所以如果在这波请求期间发生刷新,那么任何已经得到的请求(但尚未使用)当请求之一刷新时旧令牌将失败【参考方案2】:

我可能使用过以下场景。由于访问令牌验证错误会导致访问失败,但这些错误将是最小的。

    App1 调用密码授权类型的令牌 api 并获取访问令牌和刷新令牌对 (accto1/refto1) App2 在启动执行时也会这样做 (accto1/refto1) 当 App1 的访问令牌过期时,他可以通过调用具有刷新令牌授权类型的令牌 api 和他现有的刷新令牌 (refto1) 来执行刷新令牌,他将检索一对新的访问令牌和刷新令牌. (accto2/refto2)

    当 App2 在其访问令牌过期时也到达实例时,他还将尝试使用他已有的刷新令牌 (refto1) 授予刷新令牌,但由于该刷新令牌现在是授权错误,因此他将收到授权错误已到期。

    当任何一个应用程序收到此错误时,应用程序需要意识到其他人已刷新令牌,因此此时应用程序需要使用密码授权进行调用以检索新的访问令牌/刷新令牌对在行动。这一次,与示例中一样,App2 还将检索 App1 之前为他的刷新令牌授予而收到的相同访问令牌和刷新令牌对。 (accto2/refto2)

【讨论】:

以上是关于刷新 OAuth2 访问令牌的正确范例的主要内容,如果未能解决你的问题,请参考以下文章

即使访问令牌有效,也无法使用刷新令牌刷新 Google OAuth2 的访问令牌

OAUTH2 刷新令牌

如何基于使用 Oauth2 协议的身份验证改进 JWT 访问令牌和刷新令牌?

Spring OAuth2刷新令牌刷新访问令牌后更改

如何获得一个无限期使用的访问令牌/刷新令牌(oauth2 - Spotify API)

了解 Google OAuth2 刷新令牌