Почему мои пароли не хешируются? - PullRequest
0 голосов
/ 01 июня 2018

С помощью приведенного ниже кода я могу успешно добавить нового пользователя.Тем не менее, когда я смотрю на пользователей в базе данных, пароль в виде простого текста.Очевидно, что я делаю что-то не так.

В разделе, где let newUser = new User, пароль передается из тела запроса.Если ошибок нет, bcrypt должен хэшировать пароль и установить newUser.password в значение хэша, верно?

//ADD USER Submit POST Route
router.post('/register',
 [
  check('name').isLength({min:1}).trim().withMessage('Name 
required'),
  check('email').isLength({min:1}).trim().withMessage('Email 
required'),
  check('email').isEmail().trim().withMessage('Email is not valid'),
  check('password').isLength({min:1}).withMessage('Password 
required'),
  check('password').custom((value,{req, loc, path}) => {
    if (value !== req.body.password2) {
        // throw error if passwords do not match
        throw new Error("Passwords do not match");
    } else {
        return value;
    }
})
 ],
  (req,res,next)=>{

  let newUser = new User({
  name:req.body.name,
  email:req.body.email,
  username:req.body.username,
  password: req.body.password
 });

 const errors = validationResult(req);

 if (!errors.isEmpty()) {
  console.log(errors);
     res.render('register',
      { 
       newUser:newUser,
       errors: errors.mapped()
      });
   }
   else{
    bcrypt.genSalt(10, function(err, salt) {
        bcrypt.hash(newUser.password, salt, function(err, hash) {
            if(err) {
                console.log(err);
            }
            newUser.name = req.body.name;
            newUser.email = req.body.email;
            newUser.username = req.body.username;
            newUser.password = hash;
        })
    })

  newUser.save(err=>{
   if(err)throw err;
   req.flash('success','You are now registered and can log in');
   res.redirect('/users/login');
  });
 }
});

Буду признателен за любые предложения.Спасибо!

1 Ответ

0 голосов
/ 01 июня 2018

Переместите вас newUser.save в bcrypt.hash обратный вызов.save получает первый удар, и пользователь создается в базе данных до того, как bcrypt завершает и выполняет обратный вызов.

Также внутри функции обратного вызова bcrypt.hash вам больше не нужно делать следующее:

newUser.name = req.body.name;
newUser.email = req.body.email;
newUser.username = req.body.username;

Попробуйте выполнить следующее:

(req,res,next)=>{

  let newUser = new User({
  name:req.body.name,
  email:req.body.email,
  username:req.body.username,
  password: req.body.password
 });

 const errors = validationResult(req);

 if (!errors.isEmpty()) {
  console.log(errors);
     res.render('register',
      { 
       newUser:newUser,
       errors: errors.mapped()
      });
   }
   else{
    bcrypt.genSalt(10, function(err, salt) {
        bcrypt.hash(newUser.password, salt, function(err, hash) {
            if(err) {
                console.log(err);
            }
            newUser.password = hash;
            newUser.save(err=>{
               if(err)throw err;
               req.flash('success','You are now registered and can log in');
               res.redirect('/users/login');
            });
        })
    })
 }
...