无法使用 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(bcrypt
和 bookshelf
都支持):
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);
});
});
}
对 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(bcrypt
和 bookshelf
都支持):
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);
});
});
}