节点js – Bcrypt – 比较方法为正确的input密码返回false

我已经在这里经历了各种类似的问题,我试了一下,但仍然是,结果总是“错误的密码”。

我正在使用bcrypt for 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值,这是正确的,如预期。 所以,问题仍然存在。

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

validPassword : function(password){

尝试如果添加解决您的问题,所以改变它

validPassword : function(password, callBack){

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

我刚刚解决了这个问题。 大声笑这是一系列的错误,使这个很难弄清楚。 所以我只想列举一下为避免这种事情必须做的事情:

  1. hash必须以varcharforms存储在数据库中,而不是char 。 最新的原因散列是不正确的长度,所以比较将失败。 varchar是解决这个问题的方法。
  2. 处理比较结果必须在callBack函数内完成。 这是由于nodejs是asynchronous的。 这是正确的(见问题中的代码)我只想指出。 否则,比较的结果将是undefined

我希望这会帮助你们中的一些人。