【发布时间】:2021-03-26 12:11:22
【问题描述】:
我正在使用 NestJs 在 Node.js 应用程序中实现忘记/重置密码功能。
这是一般流程:
- 用户在“忘记密码”表单中输入他的电子邮件并提交请求
- 服务器生成一个以用户ID为payload的jwt token,然后以该token为链接发送邮件重置密码(例如:GET:
example.com/reset/generated_jwt_token) - 用户点击邮件中的链接,显示重置密码页面,他用新密码填写表单并以密码作为正文提交表单(例如:POST:
example.com/reset/generated_jwt_token) - 服务器验证令牌(未过期 + 来自有效负载的用户 ID 存在于数据库中)并更新密码。
这种方法的主要问题是 jwt 令牌可以无限次使用来重置密码(直到它在 X 分钟后过期)。
有没有办法解决这个问题?有人说将当前密码的哈希作为有效负载,因为无论如何它都会被更改并保证使用 1 次,但我不喜欢这种方法。
编辑:我遇到的另一种方法是在 jwt 令牌的数据库中创建一个不能多次使用的黑名单集合。或者在redis中使用缓存同样的方式,但是看起来扩展性不是很好。
【问题讨论】:
标签: javascript node.js security jwt forgot-password