将散列密码保存到 Sequelize 违背了我保存散列密码的简单愿望
Saving hashed password to Sequelize is defying my simple wish to save a hashed password
这是我第一天将 Sequelize 与 postgreql 一起使用,所以请原谅我天真的问题。
我有一个简单的模型可以试用:
var User = sequelize.define("user", {
username: Sequelize.STRING,
password: Sequelize.STRING
})
我使用 expressjs/node 和 passportJS 让用户 signup/register:
passport.use('local-register', new LocalStrategy({
passReqToCallback: true
}, function (req, username, password, done) {
User.findOne({ where: { username: username } }).then(function (user) {
if (user) {
return done(null, false, { message: "enter email that belongs to you please..." },
console.log('That email is already taken'));
} else {
//use bcrypt to salt and hash the password
let saltRounds = 2;
let hashedpass = bcrypt.hash(password, saltRounds);
var data = {
username: username,
password: hashedpass //password
};
User.create(data).then(function (newUser, created) {
if (!newUser) {
return done(null, false);
}
if (newUser) {
return done(null, newUser);
}
});
}
}).catch(err => { console.log("catch error :", err) });
}));
现在,在我尝试注册为用户后,出现错误:
UnhandledPromiseRejectionWarning: SequelizeValidationError: string violation: password cannot be an array or an object
at InstanceValidator._validate (D:\mycode\postegresql\postee1\node_modules\sequelize\lib\instance-validator.js:78:13)
at processTicksAndRejections (internal/process/next_tick.js:81:5)
我知道这是对密码 STRING 的续集验证,但我没有添加任何验证,以及什么类型的续集数据类型可以接受散列密码?
我了解如何向我的模型添加挂钩,并且它在保存到数据库之前正确地对密码进行哈希处理:
hooks: {
beforeCreate: (user) => {
const salt = bcrypt.genSaltSync(2);
user.password = bcrypt.hashSync(user.password, salt);
}
},
instanceMethods: {
validPassword: function (password) {
return bcrypt.compareSync(password, this.password);
}
}
但是我想在我的服务器代码中散列密码,就像我在上面尝试的那样。如何修复上面的验证错误?我只想在我的护照句柄中使用 Bycrpt。数据类型错误吗?
如何在不接触我的模型的情况下修复此错误?这应该不是问题,因为我已经对密码进行了哈希处理,我只需要保存它,但似乎 Sequelize 正在强制采用特定的方式来做到这一点,所以对于那里的所有 sequelize NINJAS,我该如何解决这个问题?
您调用了 hash
w/o 传递回调。
您需要使用同步版本 hashSync
而不是 hash
let hashedpass = bcrypt.hashSync(password, saltRounds);
或使用异步版本hash
。
let hashedpass = await bcrypt.hash(password, saltRounds);
// OR
bcrypt.hash(password, saltRounds).then(hash => {
hashedpass = hash
}
这是我第一天将 Sequelize 与 postgreql 一起使用,所以请原谅我天真的问题。 我有一个简单的模型可以试用:
var User = sequelize.define("user", {
username: Sequelize.STRING,
password: Sequelize.STRING
})
我使用 expressjs/node 和 passportJS 让用户 signup/register:
passport.use('local-register', new LocalStrategy({
passReqToCallback: true
}, function (req, username, password, done) {
User.findOne({ where: { username: username } }).then(function (user) {
if (user) {
return done(null, false, { message: "enter email that belongs to you please..." },
console.log('That email is already taken'));
} else {
//use bcrypt to salt and hash the password
let saltRounds = 2;
let hashedpass = bcrypt.hash(password, saltRounds);
var data = {
username: username,
password: hashedpass //password
};
User.create(data).then(function (newUser, created) {
if (!newUser) {
return done(null, false);
}
if (newUser) {
return done(null, newUser);
}
});
}
}).catch(err => { console.log("catch error :", err) });
}));
现在,在我尝试注册为用户后,出现错误:
UnhandledPromiseRejectionWarning: SequelizeValidationError: string violation: password cannot be an array or an object
at InstanceValidator._validate (D:\mycode\postegresql\postee1\node_modules\sequelize\lib\instance-validator.js:78:13)
at processTicksAndRejections (internal/process/next_tick.js:81:5)
我知道这是对密码 STRING 的续集验证,但我没有添加任何验证,以及什么类型的续集数据类型可以接受散列密码?
我了解如何向我的模型添加挂钩,并且它在保存到数据库之前正确地对密码进行哈希处理:
hooks: {
beforeCreate: (user) => {
const salt = bcrypt.genSaltSync(2);
user.password = bcrypt.hashSync(user.password, salt);
}
},
instanceMethods: {
validPassword: function (password) {
return bcrypt.compareSync(password, this.password);
}
}
但是我想在我的服务器代码中散列密码,就像我在上面尝试的那样。如何修复上面的验证错误?我只想在我的护照句柄中使用 Bycrpt。数据类型错误吗? 如何在不接触我的模型的情况下修复此错误?这应该不是问题,因为我已经对密码进行了哈希处理,我只需要保存它,但似乎 Sequelize 正在强制采用特定的方式来做到这一点,所以对于那里的所有 sequelize NINJAS,我该如何解决这个问题?
您调用了 hash
w/o 传递回调。
您需要使用同步版本 hashSync
而不是 hash
let hashedpass = bcrypt.hashSync(password, saltRounds);
或使用异步版本hash
。
let hashedpass = await bcrypt.hash(password, saltRounds);
// OR
bcrypt.hash(password, saltRounds).then(hash => {
hashedpass = hash
}