bcrypt.compare обещание всегда возвращает ложь - PullRequest
0 голосов
/ 31 декабря 2018

Я просматривал другие проблемы с bcrypt.compare на GitHub, и ни одно из решений не помогло мне.Всегда происходит сбой в console.log («fail 3») внутри bcrypt.compare ()

Я пытался переключить .then () вместо использования обратного вызова с bcrypt.compare, как это было предложено в другом посте, ноэто не поможетЛюбая помощь будет принята с благодарностью!

Ниже приведена копия моего кода и краткое описание используемых версий:

  • Узел v8.12.0
  • Экспресс 4.16.0
  • bcrypt3.0.3
  • jsonwebtoken 8.4.0
  • mongoose 5.4.1

Bcrypt Hash (хеширование пароля)

function saveUserData(req, res, next, userSignUpInfo, info){
bcrypt.hash(req.body.email, 10, (err, hash) =>{ 
if (err){   
  return res.status(500).json({
    error: err
  })
} else {
  console.log('inside test route')
  console.log('req.body.fnUserName', userSignUpInfo.fnUserName)
  const userData = new UserData({
    fnUserName : userSignUpInfo.fnUserName,
    password : hash,
    email : req.body.email,
    verify: userSignUpInfo.verify,
    createAccountDate: userSignUpInfo.createAccountDate,
    userId : userSignUpInfo.userId,
    friends: null,
    online: null
    })
  userData.save()
    .then(result => {
      console.log('result from MongoDB Cloud', result);
      saveApiData(info, userSignUpInfo, res);
  })
  .catch(err => console.log('error from MongoDB Cloud', err));
}
})
}

Bcrypt Compare (Auth User)

    router.post('/login', (req, res, next) => {
    UserData.find({email: req.body.email})
    .exec()
    .then(user => {
      if(user.length < 1) {
        console.log("failed 1")
     return res.status(401).json({
      message: 'Authentication Failed'
    });
    }
    console.log('user[0].password', user[0].password)
    console.log(' user[0].password',  user[0].password)
    console.log(' req.body.password',  req.body.password)

    bcrypt.compare(req.body.password,user[0].password).then(function(err, result) {
    if (err) {
      console.log("failed 1")
      return res.status(401).json({
        message: 'Authentication Failed'

      });
    }
    if (result) {
      const token = jwt.sign(
        {
        email: user[0].email,
        userId: user[0].userId
        },
        process.env.JWT_KEY,
        {
          expiresIn: "1h"  // he suggested one hour
        }
      );
      console.log("failed 2")
      return res.status(200).json({
        message: 'Authentication Successful',
        token: token
      })
    } else {
      console.log("failed 3")
      res.status(401).json({
        message: 'Authentication Failed'
      })
    }
    })
    })
     .catch(err => {
     console.log('err in login', err);
     res.status(500).json({
      error: err,
      message: 'error logging in'
    })
     })
    });

Ответы [ 3 ]

0 голосов
/ 31 декабря 2018

Похоже, вы не возвращаете свой res.status в блоке else { console.log("failed 3") , как вы это делаете в блоках 2 и 1.

0 голосов
/ 31 декабря 2018

result всегда будет неопределенным, так как обещания возвращают одно значение, а ошибки просто генерируются в ключевой фразе.Таким образом, в основном, в вашем коде err будет содержать фактический результат.
Ваш код должен выглядеть следующим образом:

bcrypt.compare(req.body.password,user[0].password).then((result)=>{
  if(result){
    console.log("authentication successful")
    // do stuff
  } else {
    console.log("authentication failed. Password doesn't match")
    // do other stuff
  }
})
.catch((err)=>console.error(err))
0 голосов
/ 31 декабря 2018

Обычно пароль сохраняется в виде хэша в базе данных.Кроме того, укажите достаточную длину для сохранения хешей в базе данных (не менее 60 вариантов).Для этого

schema.pre("save", function (next) {
    bcrypt.hash(this.password, 10, (err, hash) => {
        this.password = hash;
        next();
    });
});

Затем простой пароль сравнивается с хешем из базы данных.

bcrypt.hash('mypassword', 10, function(err, hash) {
    if (err) { throw (err); }
    bcrypt.compare('mypassword', hash, function(err, result) {
        if (err) { throw (err); }
        console.log(result);
    });
});
...