【问题标题】:bcrypt-nodejs compare method returns false every timebcrypt-nodejs 比较方法每次都返回 false
【发布时间】: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: '/#/'
    }))

【问题讨论】:

    标签: javascript node.js mongoose bcrypt


    【解决方案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;

    【讨论】:

    • 啊,我觉得自己像个白痴!非常感谢马可现在顺利运行!问题是引号。我从来没有抓住它,因为我注销了它找到的用户并且它显示了一个散列密码,所以我认为它正在对我输入的密码进行散列......它还会散列什么???无论如何感谢您的帮助,我现在使用 stackoverflow 一对一!
    【解决方案2】:

    我遇到了类似的问题,bcrypt.compare() 总是返回 false,结果我以错误的顺序传递参数,请确保将纯密码作为第一个参数传递。

    bcrypt.compare(plainPassword, hashedPassword)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 2013-01-25
      • 2015-08-21
      • 1970-01-01
      相关资源
      最近更新 更多