【发布时间】:2014-05-30 07:56:11
【问题描述】:
我关注了来自 scotch.io 的this tutorial,了解如何使用 node.js 构建用户身份验证(顺便说一句,教程很棒)。但是,当调用verifyPassword(password) 来检查用户密码时,由于某种原因,该值总是返回为false。
我将 brcypt.js 和 sequelize.js 用于我的 express 项目。
模型用户的自定义方法:
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;
});
});
}
我应该怎么做?
【问题讨论】:
标签: node.js authentication passport.js bcrypt sequelize.js