bcrypt-nodejs 比较方法 returns false 每次
bcrypt-nodejs compare method returns false every time
我正在尝试使用 mongoose、passport-local 和 bcrypt-nodejs 登录我的应用程序。
userSchema pre('save') 函数工作正常并保存散列密码。但是 bcrypt 比较方法每次都会 return false。
这是我的用户架构
var userSchema = mongoose.Schema({
login:{
local:{
email: {type: String, unique: true, required: true},
password: {type: String, unique: true, required: true}
}
}
userSchema.pre('save', function(next) {
bcrypt.hash('user.login.local.password', null, null, function(err, hash){
if(err){
next(err);
}
console.log('hash', hash);
user.login.local.password = hash;
next();
})
});
userSchema.methods.validPassword = function(password, cb){
bcrypt.compare(password, this.login.local.password, function(err, isMatch){
if(err) return cb(err);
cb(null, isMatch);
})
module.exports = mongoose.model('User', userSchema);
这很好用,并用散列密码保存了一个新用户
这是我的登录策略
无论用户输入什么信息,这总是 return false
passport.use('local-login', new LocalStrategy({
usernameField: 'email',
passwordField: 'password',
passReqToCallBack: true
},
function(email, password, done){
User.findOne({ 'login.local.email' : email }, function(err, user){
if(err){
console.log(err);
return done(err);
}
if(!user){
console.log('no user found');
return done(err);
}
user.validPassword(password, function(err,match){
if(err){
console.log(err);
throw err;
}
console.log(password, match);
})
})
}))
最后是我的路线
app.post('/user/login', passport.authenticate('local-login'{
successRedirect: '/#/anywhereBUThere'
failureRedirect: '/#/'
}))
问题的根源很可能是比较函数返回 false,因为您确实在比较两个不相同的哈希值。
您似乎在传递字符串“user.login.local.password”,而不是您的 userSchema 预保存函数中的实际密码:
例如这个
bcrypt.hash('user.login.local.password', null, null, function(err, hash){
应该是 bcrypt.hash(user.login.local.password, null, null, function(err, hash){
(作为第一个参数传入的密码没有单引号。)
此外,您随后将生成的散列设置为 'user' 对象,该对象似乎存在于您的用户模型之外。我看不到该代码,但我怀疑您没有更新保存到 mongoDB.
的用户模型的哈希值
例如
user.login.local.password = hash;
应该是
this.login.local.password = hash;
我有一个类似的问题,其中 bcrypt.compare()
总是返回 false
,原来我传递参数的顺序不正确,请确保将明文密码作为第一个参数传递。
bcrypt.compare(plainPassword, hashedPassword)
我正在尝试使用 mongoose、passport-local 和 bcrypt-nodejs 登录我的应用程序。
userSchema pre('save') 函数工作正常并保存散列密码。但是 bcrypt 比较方法每次都会 return false。
这是我的用户架构
var userSchema = mongoose.Schema({
login:{
local:{
email: {type: String, unique: true, required: true},
password: {type: String, unique: true, required: true}
}
}
userSchema.pre('save', function(next) {
bcrypt.hash('user.login.local.password', null, null, function(err, hash){
if(err){
next(err);
}
console.log('hash', hash);
user.login.local.password = hash;
next();
})
});
userSchema.methods.validPassword = function(password, cb){
bcrypt.compare(password, this.login.local.password, function(err, isMatch){
if(err) return cb(err);
cb(null, isMatch);
})
module.exports = mongoose.model('User', userSchema);
这很好用,并用散列密码保存了一个新用户
这是我的登录策略
无论用户输入什么信息,这总是 return false
passport.use('local-login', new LocalStrategy({
usernameField: 'email',
passwordField: 'password',
passReqToCallBack: true
},
function(email, password, done){
User.findOne({ 'login.local.email' : email }, function(err, user){
if(err){
console.log(err);
return done(err);
}
if(!user){
console.log('no user found');
return done(err);
}
user.validPassword(password, function(err,match){
if(err){
console.log(err);
throw err;
}
console.log(password, match);
})
})
}))
最后是我的路线
app.post('/user/login', passport.authenticate('local-login'{
successRedirect: '/#/anywhereBUThere'
failureRedirect: '/#/'
}))
问题的根源很可能是比较函数返回 false,因为您确实在比较两个不相同的哈希值。
您似乎在传递字符串“user.login.local.password”,而不是您的 userSchema 预保存函数中的实际密码:
例如这个
bcrypt.hash('user.login.local.password', null, null, function(err, hash){
应该是 bcrypt.hash(user.login.local.password, null, null, function(err, hash){
(作为第一个参数传入的密码没有单引号。)
此外,您随后将生成的散列设置为 'user' 对象,该对象似乎存在于您的用户模型之外。我看不到该代码,但我怀疑您没有更新保存到 mongoDB.
的用户模型的哈希值例如
user.login.local.password = hash;
应该是
this.login.local.password = hash;
我有一个类似的问题,其中 bcrypt.compare()
总是返回 false
,原来我传递参数的顺序不正确,请确保将明文密码作为第一个参数传递。
bcrypt.compare(plainPassword, hashedPassword)