我正在使用NestJ实现Node.js应用程序中的忘记/重置密码功能。
这就是一般的流程:
example.com/reset/generated_jwt_token)example.com/reset/generated_jwt_token)这种方法的主要问题是,可以无限地使用jwt令牌来重置密码(直到它在X分钟后过期)。
有办法解决这个问题吗?有人说,将当前密码的散列作为有效负载,因为它无论如何都会被更改,并保证一次使用,但我不喜欢这种方法。
编辑:我遇到的另一种方法是在jwt令牌的DB中创建一个黑名单集合,不能超过一次使用。或者在redis中使用缓存也是同样的方式,但它似乎没有很好的可伸缩性。
发布于 2020-12-15 20:15:55
生成令牌时,您可以将其保存到该用户下的数据库中(或该令牌中嵌入的唯一标记)。然后,服务器验证令牌:
(1)单击重置电子邮件中的链接
(2)当用户提交重置密码页时
通过检查令牌是否与数据库中该用户的令牌相同。
另外,当用户成功地更改他们的密码时,清除数据库中的令牌,这样它就不能再使用了。
发布于 2021-04-27 11:50:33
我同意@CertainPerformance (接受)的回答。
我想补充一下-考虑使用认证-流-js。你根本不用担心实现!
它是一个能够回答大多数流程的模块--认证、注册、忘记密码、更改密码等等,而且它已经足够安全,所以应用程序可以使用它,而不必担心它很容易被黑客攻击。
我在一篇文章中写道:
忘记密码 用户在忘记密码表单中输入电子邮件,然后单击submit。服务器(AFM)验证帐户是否存在且未锁定。如果锁定,AFM将抛出一个错误。否则,使用令牌将电子邮件发送给用户。该令牌存储在用户的同一行/文档/记录的DB中。
https://stackoverflow.com/questions/65312995
复制相似问题