Bcrypts比较和验证功能对任何密码进行验证

时间:2019-01-07 12:03:48

标签: node.js authentication bcrypt

我正在使用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;
};

我使用护照称呼“身份验证”功能

if (!user.authenticate(password)) {
 return done(null, false, {message: 'Senha inválida.'});
}

有人可以帮忙吗?

[EDIT]-我认为问题是异步调用。修改为同步,它的工作原理!如果有人发现异步通话的问题在哪里,我将不胜感激

1 个答案:

答案 0 :(得分:1)

关于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的更多信息。