节点js - Bcrypt - compare方法为正确的输入密码返回false

时间:2016-03-29 21:46:48

标签: node.js postgresql sequelize.js bcrypt

我在这里遇到了各种类似的问题,我尝试了所有这些问题,但结果仍然是“密码错误”。

我正在使用bcrypt作为nodejs,我的密码哈希值存储在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);
     }
});

我希望这很清楚。提前致谢。侨

更新我: callBack已添加到validPassword,但这并未解决问题。我还检查了this.password值,这是正确的和预期的。所以,问题仍然存在。

2 个答案:

答案 0 :(得分:1)

我想您忘记将callBack作为参数添加到

validPassword : function(password){

尝试添加可以解决您的问题,请将其更改为

validPassword : function(password, callBack){

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

答案 1 :(得分:1)

我刚刚解决了这个问题。大声笑这是一系列的错误,这使得很难弄明白。所以我只想列举一些必须做的事情来避免这些事情:

  1. hash必须以varchar存储在数据库中,而不是char。最新导致散列的长度不正确,因此比较将失败。 varchar是解决此问题的方法。
  2. 必须在callBack函数内部处理比较结果。这是因为nodejs是异步的。这是正确的(请参阅问题中的代码)我只想指出它。否则,比较结果为undefined
  3. 我希望这会对你们中的一些人有所帮助。