我正在使用"bcrypt": "^3.0.4"
,并且拥有最新的稳定版本的node。我面临的问题是用户尝试登录时。使用正确的密码,首次登录尝试始终不会成功,而第二次尝试则成功。我想知道我在哪里弄错了。这里的假设是用户输入了数据库中可用的电子邮件/用户名,在这种情况下为mongodb。
User.findOne({ "email": user.email }, (err, ruser) => {
if (err) {
res.send(err);
}
else {
bcrypt.hash(user.password, 10, function (err, hash) {
if (err) {
console.log(err);
}
else {
bcrypt.compare(user.password, hash).then(function (res) {
if (res) {
pass = true;
}
else {
pass = false;
}
});
res.json(pass);
}
});
}
});
谢谢。
答案 0 :(得分:1)
您的代码有两个问题。
bcrypt.compare
是异步的,并且res.json
在.then之外,因此res.json
实际上是在比较之前或在pass
设置之前运行的。
pass
没有用var
/ let
定义,因此pass
成为全局变量,这对安全性具有很强的影响。 ,因为两个用户同时登录会导致竞争(例如,会话A中的pass
可能会在会话B中重新解析)
由于上述两个错误,它的工作原理是:在第一个请求中,在比较之前执行res.json
,并且尚未设置pass
,因此它返回null。在第二个请求上,在比较之前再次执行res.json
,但是这次pass
包含最后一次比较的值,因此您得到的实际上是最后一次比较的结果。
此外,如果您只是在测试,也可以,否则此代码不执行任何操作,因为此代码将生成给定密码的哈希,并将给定密码与生成的哈希进行比较,这肯定永远是正确的。 / p>