我正在使用 NestJs 在 Node.js 应用程序中实现忘记/重置密码功能。
这是一般流程:
- 用户在“忘记密码”表单中输入他的电子邮件并提交请求
- 服务器生成一个以用户 ID 作为负载的 jwt token ,然后发送一封电子邮件,以 token 作为重置密码的链接(例如:GET:
example.com/reset/generated_jwt_token
) - 用户点击他的电子邮件中的链接,重设密码页面呈现,他用新密码填写表单并提交以密码作为正文的表单(例如:POST:
example.com/reset/generated_jwt_token
) - 服务器验证 token (未过期 + 有效负载中的用户 ID 存在于数据库中)并更新密码。
这种方法的主要问题是可以无限次使用 jwt token 来重置密码(直到它在 X 分钟后过期)。
有办法解决吗?有人说将当前密码的哈希值作为有效负载,因为它无论如何都会被更改并保证使用 1 次,但我不喜欢这种方法。
编辑:我遇到的另一种方法是在 jwt token 的数据库中创建一个不能多次使用的黑名单集合。或者用同样的方式在redis中使用缓存,但它似乎不是很可扩展。
最佳答案
生成 token 后,您可以将其(或嵌入其中的独特内容)保存到该用户下的数据库中。然后,服务器验证 token :
(1) 当重置邮件中的链接被点击时
(2)当用户提交重设密码页面时
通过检查 token 是否与数据库中该用户的 token 相同。
此外,当用户成功更改密码时,从数据库中清除 token ,使其无法再次使用。
关于javascript - 如何在 Node.js 中正确实现 "forgot/reset password"功能? (使用一次性 token ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65312995/