bcrypt-nodejs 比较方法每次都返回 false
Posted
技术标签:
【中文标题】bcrypt-nodejs 比较方法每次都返回 false【英文标题】:bcrypt-nodejs compare method returns false every time 【发布时间】:2015-08-10 06:29:33 【问题描述】:我正在尝试使用 mongoose、passport-local 和 bcrypt-nodejs 登录我的应用程序。
userSchema pre('save') 函数可以正常工作并保存散列密码。但是 bcrypt compare 方法每次都会返回 false 。
见bcrypt-nodejs
这是我的用户架构
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);
这工作正常,并使用散列密码保存新用户
这是我的登录策略
无论用户输入什么信息,这总是返回 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: '/#/'
))
【问题讨论】:
【参考方案1】:问题的根源很可能是比较函数返回 false,因为您确实在比较两个不同的哈希值。
您似乎在 userSchema 预保存函数中传递了字符串“user.login.local.password”而不是实际密码:
例如这
bcrypt.hash('user.login.local.password', null, null, function(err, hash)
应该是 bcrypt.hash(user.login.local.password, null, null, function(err, hash)
(作为第一个参数传入的密码中没有单引号。)
此外,您将生成的哈希设置为“用户”对象,该对象似乎位于您的用户模型之外。我看不到该代码,但我怀疑您没有更新保存到 mongoDB 的用户模型上的哈希值。
例如
user.login.local.password = hash;
应该是
this.login.local.password = hash;
【讨论】:
啊,我觉得自己像个白痴!非常感谢马可现在顺利运行!问题是引号。我从来没有抓住它,因为我注销了它找到的用户并且它显示了一个散列密码,所以我认为它正在对我输入的密码进行散列......它还会散列什么???无论如何感谢您的帮助,我现在使用 *** 一对一!【参考方案2】:我遇到了类似的问题,bcrypt.compare()
总是返回 false
,结果我以错误的顺序传递参数,请确保将纯密码作为第一个参数传递。
bcrypt.compare(plainPassword, hashedPassword)
【讨论】:
以上是关于bcrypt-nodejs 比较方法每次都返回 false的主要内容,如果未能解决你的问题,请参考以下文章