gpt4 book ai didi

node.js - bcrypt.compare() 在验证密码时总是返回 false

转载 作者:行者123 更新时间:2023-12-03 22:16:46 26 4
gpt4 key购买 nike

我关注了this tutorial来自 scotch.io 关于如何使用 node.js 构建用户身份验证(顺便说一句很棒的教程)。然而,当 verifyPassword(password)被调用来检查用户密码,由于某种原因,该值总是返回为 false。

我正在为我的 express 项目使用 brcypt.js 和 sequelize.js。

模型用户的自定义方法:

classMethods : {

setPassword : function(password) {

return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);

}

},
instanceMethods: {

verifyPassword: function(password) {
return bcrypt.compare(password, this.password, function(err, result) {

if (err) throw err;
return result;

});
}

}

这就是我创建新用户的方式:
User.find({where: {email : email}})
.complete(function(err, user) {

// if there are any errors, return the error
if (err){
return done(err);
}

// check to see if theres already a user with that email
if (user) {
return done(null, false, req.flash('signupMessage', 'That email is already taken.'));
} else {


User
.create({
email: email,
password: User.setPassword(password)

})
.complete(function(err, newUser) {
if (err)
throw err;
return done(null, newUser)
})


}

});

验证密码:
User.find({where: { email :  email }})
.complete(function(err, user) {

if (err)
return done(err);

if (!user){

return done(null, false, req.flash('loginMessage', 'No user found.'));
}
// if the user is found but the password is wrong

if (!user.verifyPassword(password)){

return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.'));
}
// all is well, return successful user
return done(null, user);
});

我知道在 bcrypt 中使用异步模式更好,但是当我尝试这样的事情时它总是给我“密码未定义”:
setPassword : function(password) {
return bcrypt.genSalt(10, function(err, salt) {
if (err) return err;
return bcrypt.hash(password, salt, function(err, hash) {
if (err) return err;
return hash;
});
});
}

我应该怎么做?

最佳答案

bcrypt.compare 似乎是异步的,您应该扩展您的比较函数以进行回调。

您可以对 setPassword 执行相同的操作,但您必须在回调中进行创建。您现在正在同步问题中使用它,因此它必须是同步函数。

您可以执行以下操作:

classMethods : {
setPassword : function(password, callback) {
// Pseudo, i don't actually know the bcrypt api
return bcrypt.hash(password, bcrypt.genSaltSync(8), callback);
}
},
instanceMethods: {
verifyPassword: function(password, callback) {
bcrypt.compare(password, this.password, callback);
}
}

然后将您的接口(interface)代码重写为:
Uset.setPassword(password, function (err, password) {
if (err) return done(err);
User.create({
email: email,
password: password
}).done(done);
});

user.verifyPassword(password, function (err, result) {
if (err || result) return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.'));
return done(null, user);
});

在创建时加密密码是钩子(Hook)派上用场的地方,您可以使用 beforeCreate 钩子(Hook)在密码保存之前加密密码,而不是自己处理加密。
User.beforeCreate(function (model, done) {
bcrypt.hash(model.password, bcrypt.genSaltSync(8), function (err, password) {
if (err) return done(err);
model.password = password;
done();
});
});

User.create({
email: email,
password: password // Unencrypted
});

before create 将确保在将值插入数据库之前对其进行加密。

关于node.js - bcrypt.compare() 在验证密码时总是返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23092581/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com