【问题标题】:Reset password in node js在节点js中重置密码
【发布时间】:2017-09-24 05:19:11
【问题描述】:

我正在尝试添加重置密码功能。用户输入用户名、电子邮件和全名,当这些值与数据库中的数据匹配时,更改密码,否则会显示错误。 这就是我正在做的-

app.post("/reset",function(req,res){
User.findByUsername(req.body.username).then(function(sanitizedUser){
if (sanitizedUser){
    sanitizedUser.setPassword(req.body.password, function(){
        sanitizedUser.save();
        req.flash("success","password resetted");
            res.redirect("/login");
    });
} else {
    req.flash("error","User doesnt exist");
            res.redirect("/reset");
}
},function(err){
    console.log(err);res.redirect("/");
});

});

但我想比较的不仅仅是用户名,我还想比较用户的电子邮件和姓名。当我添加 - User.find({username:req.body.username},{email:req.body.email},{name:req.body.name})并输入了一些错误的数据,页面只是不断重新加载而不是显示错误。 我应该做些什么改变呢?请帮忙。

我正在使用 express、nodejs、mongodb

【问题讨论】:

  • 您在使用 Passport 吗? passportjs.org
  • 是的,我正在使用 Passport @DanGreen-Leipciger

标签: node.js mongodb express authentication mongoose


【解决方案1】:
if(req.body.username && req.body.email && req.body.name && req.body.password){

    //add logic to hash password below
    let hashedPassword = req.body.password;


    Model.findOneAndUpdate(
        { username : req.body.username, email : req.body.email, name : req.body.name },
        { "$set" : { password : hashedPassword } },
        //if below option "new" is set to true, call back will return new document else it will return old document beforeupdate
        { new : true },
        //call back
        function(err, person){
            if(err){
                //err found
                res.send(err);
            }
            else{
                // no error and also person exists
                res.send('Password successfully updated..');
            }
        }
    );
}
else{
    res.send('Please provide all details..');
}

【讨论】:

  • 显示“密码已成功更新..”,但新密码无效,旧密码有效
  • 如果你成功执行 console.log(person) 其他部分,你会得到一个 person 对象吗?它显示的是哪个密码?
  • 而且我还注意到,在更改密码后,现在我在 mongodb 中找到用户时可以看到普通英文密码,之前它只是用来显示盐和哈希
  • 我提到的为哈希密码添加逻辑的推荐,您需要在其中获取哈希密码,以便它将以dB为单位的加密格式保存..
  • 好的,这也是新密码没有保存的原因吗?
【解决方案2】:

您有一个重定向循环

如果是!sanitizedUser,您会重定向到同一页面res.redirect('/reset')

这会导致您的页面不断重新加载。

你应该换行:

res.redirect('/reset')

res.status(500).send('Some useful error message')

【讨论】:

  • 它仍然无法正常工作,顺便说一句,您是否考虑到我使用多个 creteria 进行搜索(正如我在问题末尾提到的)
  • 你试过硬编码的值吗?即 User.find({username:"dan"},{email:"foo@bar.com"},{name:"Dan Green-Leipciger"})?
  • 我该如何尝试?如果我按照您所说的更改代码,密码可能会更改,但我怎么知道,因为密码保存为一些盐和哈希
  • 首先,您不应该在这里触摸密码。您需要通过电子邮件发送带有到期时间的重置令牌。让用户单击带有该令牌作为获取参数的链接,在您的路线中检查该链接,然后才允许他们重置密码。
  • 是的,哈希和盐改变了,我认为这意味着密码改变了
猜你喜欢
  • 2021-11-07
  • 1970-01-01
  • 2019-09-09
  • 2018-11-26
  • 2023-03-05
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多