Bcrypts 比较和验证功能验证任何密码
Bcrypts compare and authenticate function authenticate any password
我正在使用 bcrypt 对系统中的用户进行身份验证。当我注册用户时,使用代码:
UserSchema.pre("save", async function(next) {
var user = this;
if (user.isModified('password')) {
var salt = bcrypt.genSaltSync(10);
await bcrypt.hash(user.password, salt, null, function(err, hash) {
if(err){
console.log(err);
}else {
user.password = hash;
}
});
}
next();
});
好的,哈希已创建并保存在 mongo 中。我的问题是,当我用这个用户登录时,任何密码都有效。这是我的比较功能:
UserSchema.methods.authenticate = async function(password) {
var user = this;
var isAuthenticaded = await bcrypt.compare(password, user.password,
function(err, res){
if(res){
return true;
}else{
return false;
}
});
return isAuthenticaded;
};
我用护照调用函数'authenticate':
if (!user.authenticate(password)) {
return done(null, false, {message: 'Senha inválida.'});
}
有人可以帮忙吗?
[编辑] - 我认为问题出在异步调用上。修改为同步并且有效!如果有人发现异步调用的问题在哪里,我将不胜感激
关于 async
实施。
UserSchema.pre('save', async function save(next) {
if (!this.isModified('password')) return next();
try {
const salt = await bcrypt.genSalt(10);
this.password = await bcrypt.hash(this.password, salt);
return next();
} catch (err) {
return next(err);
}
});
UserSchema.methods.authenticate = async function(password) {
return bcrypt.compare(password, this.password);
};
现在,如果 user
使用我们的 async
身份验证方法,我们必须 await
获得结果。
if (!await user.authenticate(password)) {
return done(null, false, {message: 'Senha inválida.'});
}
您可以阅读有关 pre 的更多信息。
我正在使用 bcrypt 对系统中的用户进行身份验证。当我注册用户时,使用代码:
UserSchema.pre("save", async function(next) {
var user = this;
if (user.isModified('password')) {
var salt = bcrypt.genSaltSync(10);
await bcrypt.hash(user.password, salt, null, function(err, hash) {
if(err){
console.log(err);
}else {
user.password = hash;
}
});
}
next();
});
好的,哈希已创建并保存在 mongo 中。我的问题是,当我用这个用户登录时,任何密码都有效。这是我的比较功能:
UserSchema.methods.authenticate = async function(password) {
var user = this;
var isAuthenticaded = await bcrypt.compare(password, user.password,
function(err, res){
if(res){
return true;
}else{
return false;
}
});
return isAuthenticaded;
};
我用护照调用函数'authenticate':
if (!user.authenticate(password)) {
return done(null, false, {message: 'Senha inválida.'});
}
有人可以帮忙吗?
[编辑] - 我认为问题出在异步调用上。修改为同步并且有效!如果有人发现异步调用的问题在哪里,我将不胜感激
关于 async
实施。
UserSchema.pre('save', async function save(next) {
if (!this.isModified('password')) return next();
try {
const salt = await bcrypt.genSalt(10);
this.password = await bcrypt.hash(this.password, salt);
return next();
} catch (err) {
return next(err);
}
});
UserSchema.methods.authenticate = async function(password) {
return bcrypt.compare(password, this.password);
};
现在,如果 user
使用我们的 async
身份验证方法,我们必须 await
获得结果。
if (!await user.authenticate(password)) {
return done(null, false, {message: 'Senha inválida.'});
}
您可以阅读有关 pre 的更多信息。