我的疑问是关于使用 JWT 令牌支持同一用户同时进行多设备登录。我使用 NestJS 作为我的后端。
用户表:userid、用户名、密码(包含哈希密码)、名称、refreshToken(包含哈希刷新令牌)
当用户执行 /api/login 调用时,在拥有有效的用户名和密码的情况下,将使用 jwt 护照库生成访问令牌和刷新令牌。刷新令牌经过哈希处理并存储在该特定用户的用户表的刷新列中,并且访问令牌和刷新令牌通过响应发送到客户端。
在 /api/refresh 调用期间,用户发送的刷新令牌将使用该用户的用户表中存在的哈希刷新令牌进行验证,然后生成新的访问令牌和新的刷新令牌。新的刷新令牌在同一用户行的用户表刷新令牌列中进行散列和更新。
此流程非常适合使用单个设备登录的用户。当同一用户同时使用多个设备登录时,在登录期间,刷新令牌会在用户表的刷新令牌列中针对同一用户行进行更新,这使我们丢失同一用户行的现有/有效刷新令牌用户。
Flow:
- 用户 1 使用设备 1 登录 --> 用户 1 的刷新令牌列已使用新的刷新令牌进行更新
- 用户 1 使用设备 2 登录 --> 用户 1 的刷新令牌列被新的刷新令牌覆盖,我们丢失了为设备 1 创建的刷新令牌
我想知道为同时使用多个设备登录的用户管理 JWT 刷新流程的最佳工业实践是什么?
最简单的方法是将刷新令牌保存在单独的表中。通常,刷新令牌与用户的帐户数据分开保存,因为用户可以在任何给定时间拥有更多活动的刷新令牌。每当使用刷新令牌时,您都可以找到具体令牌并在其位置创建一个新令牌。
顺便说一句,无需对数据库中保存的刷新令牌进行哈希处理。它们对于您的系统来说是唯一的,它们不是密码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)