我passport-local-mongoose
用来将我的用户数据存储在 MongoDB 中。如果用户忘记了密码,我需要找回密码以通过电子邮件发送。它存储在盐场中。我怎样才能把它从盐里拿出来?
PS 不能使用bcrypt
,因为它不适用于 node > 0.10.x
我passport-local-mongoose
用来将我的用户数据存储在 MongoDB 中。如果用户忘记了密码,我需要找回密码以通过电子邮件发送。它存储在盐场中。我怎样才能把它从盐里拿出来?
PS 不能使用bcrypt
,因为它不适用于 node > 0.10.x
将密码转换回其原始文本的任何形式不仅不安全,而且存储它的加盐散列的全部目的是首先使这变得困难/不可能。
相反,您要做的是向用户发送/通过电子邮件发送密码重置链接,以便他们可以自己重新创建新密码。
它基本上需要创建一个您通过电子邮件发送给用户的唯一令牌。您还可以将该令牌存储到用户对象中,以便稍后进行验证。像这样的东西(伪代码):
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;
});
});
所以你现在让用户成功地重置了他们自己的密码。
有关更多实施细节,请查看本文:如何在 Node.js 中实施密码重置