实现永不过期的 OAuth 刷新令牌
Posted
技术标签:
【中文标题】实现永不过期的 OAuth 刷新令牌【英文标题】:Implementing OAuth Refresh Tokens that never expire 【发布时间】:2016-12-11 03:06:38 【问题描述】:在 OAuth 2 的上下文中,如何处理 refresh_token
到期或未到期?
我使用 JSON Web 令牌 (JWT) 作为 access_token
s,生命周期很短(20 分钟后过期)。据我了解,这意味着我不必存储access_token
,只需对其进行验证(并使用其中的受信任信息,例如作用域)。
但是,我想知道如何实现refresh_token
s。在我的研究中,我发现谷歌和其他人有refresh_token
s,它们永远是好的,除非它们被撤销,出于各种原因。我认为这意味着系统必须存储曾经发布的所有刷新令牌,以便将它们标记为已撤销。
在存储令牌时这是一个问题吗?您似乎有一组可能无限的令牌,需要永久存储和访问。
我错过了什么吗?是否有实施刷新令牌的最佳实践?它们应该是(还是不是)JWT?即使使用 JWT,也应该存储 access_tokens 吗?如果是这样,是否有任何理由让它们超过有效期?随着时间的推移,JWT 机密会发生什么变化?
【问题讨论】:
【参考方案1】:这是个好问题,refresh_tokens 通常不会过期,这样应用程序就可以生成新的访问令牌,而无需定期要求用户重新进行身份验证,
但应用程序需要强制限制单个客户端允许的活动刷新令牌的数量,例如:
每个 OAuth 客户端最多只能有 20 个活动的 refresh_tokens,如果达到该限制,则必须撤销最旧的令牌,并在不拒绝请求的情况下授予新的令牌。
而且,如果刷新令牌在一段时间内(例如 6 个月)没有被使用,那么令牌也需要被撤销。
通过这种方式,您可以强制限制refresh_token的消耗,这就是问题所在,这也是Google的做法,
参考Google OAuth2 Doc
【讨论】:
以上是关于实现永不过期的 OAuth 刷新令牌的主要内容,如果未能解决你的问题,请参考以下文章
使用 React Native 和 Redux 刷新 OAuth 令牌