无法使用 bcrypt 和书架将散列密码保存到数据库

Can't save hashed password to database using bcrypt and bookshelf

对 nodejs 还是很陌生,所以我经常被整个异步的事情绊倒。我试图在将密码存储到数据库之前使用 bcrypt 和 bookshelf 对密码进行哈希处理。很简单吧...

我是这样调用保存操作的,

create(data) {
    this.logger.info(`creating account`);
    return bookshelf.transaction(trx => {
        return new Account().save(data, { method: 'insert', transacting: trx });
    });
}

并且在帐户模型中,我拦截了保存操作

initialize: function() {
    let _this = this;
    const saltRounds = 10;
    _this.on('creating', function () {
        bcrypt.genSaltSync(saltRounds, function(err, salt) {
            bcrypt.hashSync(_this.get('password'), salt, function (err, hash) {
                if (err) throw err;

                _this.set('password', hash);
            });
        });
    });
}

到目前为止我查过的所有内容都表明这应该有效,但纯文本密码仍会保存到数据库中,而不是散列密码。我做错了什么?

我不确定,但我认为错误是因为你使用的是 es6 let 而不是 var 那么 this 的上下文将延迟

您使用的是同步函数,但向它们传递了不会被调用的回调(因此,密码不会被替换)。

试试这个:

initialize: function() {
  const saltRounds = 10;
  this.on('creating', () => {
    let salt = bcrypt.genSaltSync(saltRounds);
    let hash = bcrypt.hashSync(this.get('password'), salt);
    this.set('password', hash);
  });
}

或者用异步函数替换同步函数,使用 promises(bcryptbookshelf 都支持):

initialize: function() {
  const saltRounds = 10;
  this.on('creating', () => {
    return bcrypt.genSalt(saltRounds).then(salt => {
      return bcrypt.hash(this.get('password'), salt);
    }).then(hash => {
      this.set('password', hash);
    });
  });
}