Node js - Bcrypt - 比较方法 returns false 为正确的输入密码

Node js - Bcrypt - compare method returns false for the correct input password

我在这里遇到过各种类似的问题,我都试过了,但结果总是"wrong password"。

我正在为 nodejs 使用 bcrypt,我的密码哈希存储在 Postgresql 数据库中。

hashcompare方法如下:

generateHash : function(password, callBack){

    bcrypt.genSalt(8, function(err, salt) {

        bcrypt.hash(password, salt, callBack);
    });
}

validPassword : function(password, callBack){

    bcrypt.compare(password, this.password, callBack);
}

我在下面的代码中使用了这些函数:

//Generating hashing and DB storing
User.generateHash(password, function(err, hash) {

    // if there is no user with that email
    // create the user
    var newUser = User.build({

        email: email,
        password: hash
        })
        .save()
        .then(function(newUser) {

            return done(null, newUser);
        })
        .catch(function(err){

            return done(err, false);
        });
   });

//...
//Checking the password input for login

user.validPassword(password, function(err, res) {

     if(err) throw err;

     if(!res){

         return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.')); 
     }
     else{

         // all is well, return successful user
         return done(null, user);
     }
});

我希望你已经清楚了。提前致谢。再见。

更新 I : callBack 添加到 validPassword,尽管这并没有解决问题。而且我还检查了 this.password 值,它是正确的并且符合预期。所以,问题依旧。

我想你忘了将 callBack 作为参数添加到

validPassword : function(password){

如果添加解决了您的问题,请尝试将其更改为

validPassword : function(password, callBack){

此外,我不知道你的 validPassword 函数在哪里,但你可能想检查一下 this.password 是否确实引用了用户密码。

我刚刚解决了这个问题。大声笑这是一系列的错误,使这很难弄清楚。所以我只是要列举必须做些什么来避免这样的事情:

  1. hash 必须作为 varchar 而不是 char 存储在数据库中。 latest 导致散列的长度不正确,因此比较将失败。 varchar 是这个问题的解决方案。
  2. 处理比较结果必须在回调函数内部完成。这是由于 nodejs 是异步的。这是正确的(见问题中的代码)我只是想指出来。否则,比较的结果将是 undefined.

我希望这对你们中的一些人有所帮助。