Bcrypt compare总是返回false

时间:2015-12-18 17:27:01

标签: javascript node.js mongoose bcrypt

bcrypt.compare()在用户模型中使用此代码时总是返回false。这是使用bcrypt-nodejs。

User.pre('save', function (callback) {
  this.password = bcrypt.hashSync(this.password, bcrypt.genSaltSync(10))
  this.token = jwt.sign(this.email, process.env.JWT_SECRET)
  callback()
})

User.methods.verifyPassword = function ( password ) {
  const self = this

  return Q.Promise( (resolve, reject) => {
    bcrypt.compare( password, self.password, (error, isMatch) => {
      if (error) reject( new Error("Error checking user password."))
      resolve(isMatch)
    })
  })
}

我可以看到数据库中出现了一个哈希值。我可以看到正确的密码进入verifyPassword功能。

编辑:问题似乎是.pre('save', ...连续出现两次。所以新的哈希密码再次被哈希。

2 个答案:

答案 0 :(得分:0)

这是您的代码的工作版本。我不确定你的方法在幕后发生了什么,所以我把这部分组成了。

为了证明它的工作原理,将其添加到名为index.js的文件中,并使用" node index.js"运行它。

它将输出:

We got a match! true or false? true

这是代码。

var bcrypt = require('bcrypt');
var Q = require('Q');
var salt = bcrypt.genSaltSync(10);


process.env.JWT_SECRET = 'Much_Secretive,_Such_Obscure';

function SuperUser () {
  this.pre = function (password, callback) {
    this.password = bcrypt.hashSync(password, salt);
    callback.call(this, password);
  };
  this.methods = {};
}

var User = new SuperUser();

User.methods.verifyPassword = function ( password ) {
  const self = this;

  return Q.Promise( (resolve, reject) => {
    bcrypt.compare( password, self.password, (error, isMatch) => {
      if (error) reject( new Error("Error checking user password."));
      console.log("We got a match! true or false? " + isMatch);
      resolve(isMatch);
    });
  });
};

User.pre('save', function (password) {
  this.methods.verifyPassword.call(this,password);
});

如果没有看到您的全面实施,很难确定,但可能会提到这个'这个'那不是'这个'你会期待它。

我使用function.call几次来解决这个问题。

答案 1 :(得分:0)

解决方案为if (!this.isModified('password')) return callback(),如下所示。

User.pre('save', function (callback) {
  if (!this.isModified('password')) return callback()

  this.password = bcrypt.hashSync(this.password, bcrypt.genSaltSync(10))
  this.token = jwt.sign(this.email, process.env.JWT_SECRET)
  callback()
})

这是因为它在保存过程中不止一次触发。所以它有效地散列了密码,然后在第二轮中散列哈希值。