我正在使用passport-local-mongoose
将我的用户数据存储在MongoDB中。如果用户忘记密码,我需要重新密封以便在电子邮件中发送密码。它存储在盐田中。我怎样才能脱盐?
P.S。无法使用bcrypt
,因为它不适用于节点> 0.10.x
答案 0 :(得分:2)
将密码转换回原始文本的任何形式不仅不安全,而且存储盐渍哈希的全部意义在于,首先要使密码变得困难/不可能。
相反,您要做的是向用户发送/通过电子邮件发送密码重置链接,以便他们自己重新创建新密码。
它基本上需要创建一个您通过电子邮件发送给用户的唯一令牌。您还将该令牌存储到用户对象,以便稍后进行验证。像这样的东西(伪代码):
app.post('/reset-password', function(req, res){
var email = req.body.email; // you had the user enter their email
User.findByEmail(email, function(err, user){
user.token = new Token(); // some library to create a token
mail(user.email, 'Please visit http://example.com/reset-password/' + user.token);
});
});
因此,当用户收到电子邮件并访问http://example.com/reset-password/xxxxxxxx时,您可以使用该令牌验证用户并让他们创建新密码。
app.post('/reset-password/:token', function(req, res){
var token = req.params.token;
var password = req.body.password; // you had the user enter a new password
User.findByToken(token, function(err, user){
user.hash = new HashFromPassword(password); // some function to create hash from password;
});
});
因此,您现在可以让用户成功重置自己的密码。
有关更多实施详情,请查看此文章:How To Implement Password Reset In Node.js