使用访问令牌和刷新令牌保持身份验证

Posted

技术标签:

【中文标题】使用访问令牌和刷新令牌保持身份验证【英文标题】:Persisting authentication with Access Token and Refresh token 【发布时间】:2020-02-16 12:06:28 【问题描述】:

我正试图弄清楚我应该如何保持身份验证。

假设用户使用电子邮件和密码成功验证。那么服务器生成并返回两个令牌:

要存储在浏览器存储中的访问令牌(jwt 过期 15 分钟) refreshtoken(jwt 过期 7 天)作为安全 cookie。

当将 accesstoken 存储在本地存储(或会话存储)中时,React 应用程序将简单地检查它是否存在于存储中并继续渲染私有路由。所以这意味着如果用户有一个无效/被盗的访问令牌,React 似乎仍然会暂时呈现私有页面(尽管没有私有内容),直到令牌被检查并失效。这是一种奇怪的行为吗?

在这种情况下,React 应用程序是否应该在每次用户访问私有路由时验证和刷新令牌?以及它获取私人数据的任何时间?

目前,我将访问令牌和刷新令牌都分配给了安全 cookie,并且 React 中的私有路由总是在呈现私有页面之前刷新令牌。只要用户拥有有效的 cookie,这就会导致登录页面在呈现任何私人页面之前短暂闪烁。

我试图弄清楚在验证令牌时 React 应该呈现什么,以及是否应该在每次加载私有路由和获取私有数据时刷新令牌。

【问题讨论】:

【参考方案1】:

第一件事:不要将会话存储在 localstorage 或 sessionStorage 始终使用服务器端 cookie 来存储您的 jwt。

其次,在服务器端,如果您扩展到多个节点容器,您可能需要使用 Redis,只需为此创建一个快速中间件。

第三,刷新令牌应该只在访问令牌过期时使用,不需要向服务器发送垃圾邮件以获取新的访问令牌。

【讨论】:

以上是关于使用访问令牌和刷新令牌保持身份验证的主要内容,如果未能解决你的问题,请参考以下文章

我是不是正确理解用于身份验证的访问和刷新令牌技术?

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

在基于令牌的身份验证中使用刷新令牌是不是安全?

如果身份验证令牌在帐户身份验证器中过期,则使用刷新令牌

是否可以在 Spring Security 中仅使用刷新令牌请求访问令牌 oauth2?没有基本身份验证?

JWT 身份验证方案中的刷新令牌是不是应该使用与访问令牌不同的秘密进行签名?