bcrypt.compare承诺始终返回false

时间:2018-12-31 06:40:07

标签: javascript node.js express jwt bcrypt

我在GitHub上浏览了bcrypt.compare的其他问题,但没有一个解决方案对我有用。它总是在bcrypt.compare()内部的console.log(“ failed 3”)上失败

我尝试切换.then(),而不是像另一篇文章所建议的那样使用带有bcrypt.compare的回调,但这没有帮助。任何帮助将不胜感激!

下面是我的代码的副本和所用版本的摘要:

  • 节点v8.12.0
  • Express 4.16.0
  • bcrypt 3.0.3
  • jsonwebtoken 8.4.0
  • 猫鼬5.4.1

Bcrypt哈希(密码哈希)

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));
}
})
}

加密比较(身份验证用户)

    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 :(得分:0)

通常,密码将作为哈希保存在数据库中。另外,请提供足够的长度以将哈希值保存到数据库中(至少60个varchars)。为此,

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);
    });
});

答案 1 :(得分:0)

您似乎没有在 else { console.log("failed 3") 区块与失败的2区块和失败的1区块一样。

答案 2 :(得分:0)

result将始终是未定义的,因为Promise返回单个值,并且错误只是在catch短语中引发。因此,基本上,在您的代码中,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))