需要帮助刷新令牌机制

Posted

技术标签:

【中文标题】需要帮助刷新令牌机制【英文标题】:Need help regarding refresh token mechanims 【发布时间】:2022-01-03 18:32:57 【问题描述】:

我有一个面向客户端的 React 本机应用程序。 我正在使用 JWT 进行身份验证,其中包含快速过期的访问令牌 (10m) 和持久的刷新令牌 (7d)。 我有两台服务器,一台用于身份验证,一台用于获取其他内容。 例如:server.com/authserver.com/activities 我的问题是,如何在这里有一个好的刷新机制? 例如:如果用户在 2 天后登录并通过我的应用程序查询 API,我应该如何向他发送新的访问令牌(使用他的刷新令牌) - 请记住我的身份验证服务器位于单独的位置? 我在这里看到的明显解决方案是从/activities 联系/auth,获取新令牌并在响应的标题中发送新令牌,而在客户端继续检查标题中的新令牌并保存它们如果现在。 有比这更好的解决方案吗?这甚至是一个好的解决方案吗?

【问题讨论】:

【参考方案1】:

也许更好的选择是考虑使用 Backend For Frontend (a.k.a BFF) 模式来保护 SPA 应用程序。

Backend For Frontend Authentication Pattern with Auth0 and ASP.NET Core The BFF Pattern (Backend for Frontend): An Introduction Securing SPAs using the BFF Pattern (once and for all)

【讨论】:

【参考方案2】:

我会做什么,据我所知,如果访问令牌过期,大多数人都会让您的 API (/activities) 以 403 响应。前端应捕获这些响应,然后根据您拥有的刷新令牌向授权服务器请求新的访问令牌。 AS 将使用新的访问令牌进行响应,前端现在可以使用该令牌发送到 API。通常这种交换会自动发生,前端最终会使用新的访问令牌重试调用 API。

如果刷新令牌恰好过期,那么授权服务器将响应 403,这是向前端应用发出的信号,它应该要求用户再次登录。

【讨论】:

考虑到我的访问令牌的寿命很短,这不会使整个过程变得非常缓慢且对网络敏感吗?几乎所有其他呼叫都必须再次从前端联系身份验证。让我的后端在访问令牌到期(但有效的刷新令牌)时直接调用 auth 将使该过程对客户的网络具有弹性,您不觉得吗? (我是新手,所以请多多包涵) 按照您的描述实现它很诱人,但它会引入一些问题。您开始使事情复杂化 - 现在您有两个客户端(前端和后端),它们在同一组令牌上运行(通常不应该发生)。此外,您还为后端调用引入了副作用。你突然必须意识到后端可能会返回新的令牌,等等。如果您关心资源,那么我会选择 Tore 提出的 BFF 解决方案,并在前端使用会话 cookie 而不是令牌。

以上是关于需要帮助刷新令牌机制的主要内容,如果未能解决你的问题,请参考以下文章

在理解刷新令牌、存储它们的位置和方式以及存储内容方面需要帮助

如何刷新OAuth2令牌?我是否需要等待令牌过期? (Patreon API)

访问/刷新令牌混淆

IdentityServer4 - 刷新令牌混合流程 - Cookie 和存储

JWT, 为啥需要刷新令牌?

如何使用 Laravel 管理 OAuth 刷新令牌?