javascript - 如何在 Node.js 中正确实现 "forgot/reset password"功能? (使用一次性 token )

标签 javascript node.js security jwt forgot-password

我正在使用 NestJs 在 Node.js 应用程序中实现忘记/重置密码功能。

这是一般流程:

  1. 用户在“忘记密码”表单中输入他的电子邮件并提交请求
  2. 服务器生成一个以用户 ID 作为负载的 jwt token ,然后发送一封电子邮件,以 token 作为重置密码的链接(例如:GET:example.com/reset/generated_jwt_token )
  3. 用户点击他的电子邮件中的链接,重设密码页面呈现,他用新密码填写表单并提交以密码作为正文的表单(例如:POST:example.com/reset/generated_jwt_token)
  4. 服务器验证 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/

相关文章:

javascript - 使用 vanilla js 在 Dom 上显示元素后,通过单击窗口对象来隐藏元素?

javascript - 迭代 node.js 中的对象键

macos - 在 Mac OS X 10.8 上安装 GraphicsMagick

node.js - Sequelize findAll 方法不返回数据库中的条目

java - Spring 4.0.X-beans 中 springDefinitionBuilder 中 setSource 的替代方案

javascript - 替换 html 属性内所有引号的正则表达式?

javascript - Scrapy 爬行在 ASPX 网站上不起作用

r - 在 R 中反序列化不受信任的原始向量是否安全?

java - 验证 SSL 认证 Java/Android

javascript - 如何在内联CSS中使用jquery变量