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

时间:2017-03-29 07:39:07

标签: node.js bcrypt bookshelf.js

对于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);
            });
        });
    });
}

到目前为止,我所查找的所有内容都说这应该可行,但纯文本密码仍会保存到数据库中而不是哈希密码。我做错了什么?

2 个答案:

答案 0 :(得分:1)

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

试试这个:

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);
    });
  });
}

答案 1 :(得分:0)

我不确定,但我相信错误是因为你使用es6 let而不是var 那么这个背景将推迟