node.js - 使用访问令牌和刷新令牌保持身份验证
问题描述
我试图弄清楚我应该如何坚持身份验证。
假设用户使用电子邮件和密码成功进行了身份验证。然后服务器生成并返回两个令牌:
- 访问令牌(jwt 过期 15 分钟)存储在浏览器存储中
- refreshtoken(jwt 到期 7 天)作为安全 cookie。
当将 accesstoken 存储在本地存储(或会话存储)中时,React 应用程序将简单地检查它是否存在于存储中并继续渲染私有路由。所以这意味着如果用户有一个无效/被盗的访问令牌,React 似乎仍然会暂时呈现私有页面(尽管没有私有内容),直到令牌被检查并失效。这是一种奇怪的行为吗?
在这种情况下,每次用户访问私有路由时,React 应用程序是否应该验证和刷新令牌?以及它何时获取私人数据?
目前,我将访问令牌和刷新令牌都分配给了安全 cookie,并且 React 中的私有路由总是在呈现私有页面之前刷新令牌。只要用户拥有有效的 cookie,这就会导致登录页面在呈现任何私人页面之前短暂闪烁。
我试图弄清楚在验证令牌时 React 应该呈现什么,以及是否应该在每次加载私有路由和获取私有数据时刷新令牌。
解决方案
首先第一件事:不要将会话存储在 localstorage 或 sessionStorage 中始终使用服务器端 cookie 来存储您的 jwt。
其次,在服务器端,如果您扩展到多个节点容器,您可能需要使用 Redis,只需为此创建一个快速中间件。
第三,刷新令牌应该只在访问令牌过期时使用,不需要向服务器发送垃圾邮件来获取新的访问令牌。
推荐阅读
- sql - PostgreSQL 函数()中的错误“关系不存在”
- java - 使用resilience4j 重试不适用于某些异常
- javascript - 如何使用赛普拉斯在域之间复制对象的值?
- xml - xsd 文件中的本地属性声明不会验证 xml 文件中的相应属性是否有任何原因?
- python - Updateview 在更新时创建新记录
- python - 根据索引值对数据框列执行计算
- javascript - 正则表达式不应该改变大小写,但它确实
- vba - 使用 for 循环复制许多命名范围
- client - 如何手动执行仅 Firebird 客户端安装?
- html - 从 CSS 过滤器制作真正的 SVG feDropShadow 阴影:drop-shadow()?