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

Implementing OAuth Refresh Tokens that never expire

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

我正在使用 JSON Web 令牌 (JWT) 作为 access_token 的生命周期较短(20 分钟后过期)。据我了解,这意味着我不必存储 access_token,只需验证它(并使用内部的可信信息,如范围)。

但是,我想知道如何实现 refresh_tokens。在我的研究中,我发现 Google 和其他人有 refresh_token 永久有效,除非它们出于各种原因被撤销。我假设这意味着系统必须存储所有曾经发出的刷新令牌,因此它们可以被标记为已撤销。

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

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

这是一个很好的问题,refresh_tokens 通常不会过期,因此应用程序可以生成新的访问令牌而无需要求用户定期重新验证,

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

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

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

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

参考Google OAuth2 Doc