Mongoose护照本地:检索密码

时间:2015-06-11 09:14:37

标签: node.js mongoose passport-local

我正在使用passport-local-mongoose将我的用户数据存储在MongoDB中。如果用户忘记密码,我需要重新密封以便在电子邮件中发送密码。它存储在盐田中。我怎样才能脱盐?

P.S。无法使用bcrypt,因为它不适用于节点> 0.10.x

1 个答案:

答案 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