实现永不过期的 OAuth 刷新令牌

Posted

技术标签:

【中文标题】实现永不过期的 OAuth 刷新令牌【英文标题】:Implementing OAuth Refresh Tokens that never expire 【发布时间】:2016-12-11 03:06:38 【问题描述】:

在 OAuth 2 的上下文中,如何处理 refresh_token 到期或未到期?

我使用 JSON Web 令牌 (JWT) 作为 access_tokens,生命周期很短(20 分钟后过期)。据我了解,这意味着我不必存储access_token,只需对其进行验证(并使用其中的受信任信息,例如作用域)。

但是,我想知道如何实现refresh_tokens。在我的研究中,我发现谷歌和其他人有refresh_tokens,它们永远是好的,除非它们被撤销,出于各种原因。我认为这意味着系统必须存储曾经发布的所有刷新令牌,以便将它们标记为已撤销。

在存储令牌时这是一个问题吗?您似乎有一组可能无限的令牌,需要永久存储和访问。

我错过了什么吗?是否有实施刷新令牌的最佳实践?它们应该是(还是不是)JWT?即使使用 JWT,也应该存储 access_tokens 吗?如果是这样,是否有任何理由让它们超过有效期?随着时间的推移,JWT 机密会发生什么变化?

【问题讨论】:

【参考方案1】:

这是个好问题,refresh_tokens 通常不会过期,这样应用程序就可以生成新的访问令牌,而无需定期要求用户重新进行身份验证,

但应用程序需要强制限制单个客户端允许的活动刷新令牌的数量,例如:

每个 OAuth 客户端最多只能有 20 个活动的 refresh_tokens,如果达到该限制,则必须撤销最旧的令牌,并在不拒绝请求的情况下授予新的令牌。

而且,如果刷新令牌在一段时间内(例如 6 个月)没有被使用,那么令牌也需要被撤销。

通过这种方式,您可以强制限制refresh_token的消耗,这就是问题所在,这也是Google的做法,

参考Google OAuth2 Doc

【讨论】:

以上是关于实现永不过期的 OAuth 刷新令牌的主要内容,如果未能解决你的问题,请参考以下文章

google oauth2 刷新令牌何时过期?

使用 React Native 和 Redux 刷新 OAuth 令牌

如何识别OAuth令牌是否已过期?

GoogleAPI oauth2 刷新令牌在 1 小时后过期

OAuth 2.0 访问令牌已过期,刷新令牌不可用

为啥我的 Office 365 OAuth2 刷新令牌总是这么快过期?