首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Node.js中正确实现“忘记/重置密码”功能?(使用一个时间标记)

如何在Node.js中正确实现“忘记/重置密码”功能?(使用一个时间标记)
EN

Stack Overflow用户
提问于 2020-12-15 20:11:18
回答 2查看 8.1K关注 0票数 3

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

这就是一般的流程:

  1. 用户在电子邮件中输入“忘记密码”表单并提交请求。
  2. 服务器生成一个带有用户ID的jwt令牌作为有效负载,然后发送一封以令牌为链接的电子邮件来重置密码(例如: GET:example.com/reset/generated_jwt_token)
  3. 用户单击电子邮件中的链接,呈现重置密码页面,他用新密码填充表单,并以密码作为主体提交表单(例如: POST:example.com/reset/generated_jwt_token)
  4. 服务器验证令牌(未过期+来自有效负载的用户ID存在于DB中)并更新密码。

这种方法的主要问题是,可以无限地使用jwt令牌来重置密码(直到它在X分钟后过期)。

有办法解决这个问题吗?有人说,将当前密码的散列作为有效负载,因为它无论如何都会被更改,并保证一次使用,但我不喜欢这种方法。

编辑:我遇到的另一种方法是在jwt令牌的DB中创建一个黑名单集合,不能超过一次使用。或者在redis中使用缓存也是同样的方式,但它似乎没有很好的可伸缩性。

EN

Stack Overflow用户

回答已采纳

发布于 2020-12-15 20:15:55

生成令牌时,您可以将其保存到该用户下的数据库中(或该令牌中嵌入的唯一标记)。然后,服务器验证令牌:

(1)单击重置电子邮件中的链接

(2)当用户提交重置密码页时

通过检查令牌是否与数据库中该用户的令牌相同。

另外,当用户成功地更改他们的密码时,清除数据库中的令牌,这样它就不能再使用了。

票数 4
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65312995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档