【问题标题】:Bcrypt compare always returns falseBcrypt 比较总是返回 false
【发布时间】:2015-12-18 17:27:00
【问题描述】:

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', ... 连续出现两次。所以新散列的密码再次被散列。

【问题讨论】:

    标签: javascript node.js mongoose bcrypt


    【解决方案1】:

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

    为了证明它有效,请将其添加到名为 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);
    });
    

    如果没有看到您的完整实现,很难确定,但可能对“this”的引用不是您期望的“this”。

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

    【讨论】:

      【解决方案2】:

      解决方案是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()
      })
      

      这是因为它在保存过程中多次触发。所以它有效地对密码进行哈希处理,然后在第二轮对哈希进行哈希处理。

      【讨论】:

        猜你喜欢
        • 2013-01-25
        • 1970-01-01
        • 2021-09-04
        • 1970-01-01
        • 1970-01-01
        • 2017-09-16
        • 2020-05-24
        • 2022-10-05
        • 2022-11-09
        相关资源
        最近更新 更多