在NodeJS中使用JWT进行身份验证

时间:2018-12-14 17:46:58

标签: node.js jwt

我正在尝试使用带有jwt的nodejs构建身份验证,并且成功完成了将新用户注册到mongo数据库的注册过程,但是登录时遇到问题,这是登录代码:

// Login
router.post('/log', (req, res) => {
  User.findOne({ email: req.body.email }, { password: req.body.pass })
    .exec()
    .then(function(user) {
      bcrypt.compare(req.body.pass, user.pass, (err, result) => {        
        if (err) {
          return res.status(401).send('error');
        }
        if (result) {
          const token = jwt.sign({
            email: user.email,
            _id: user._id
          },
            'secret',
            {
              expiresIn: '1h'
            });
          return res.status(200).json({
            success: 'jwt',
            token: token
          });
        }
        return res.status(401).send('error happen');
      });
    })
    .catch(err => {
      res.status(401).send(err);
    });
});

当我输入邮递员/ log并在正文中键入以下内容时:

{
    "email": "bb@bbbb.bbb",
    "password": "12345",
}

我收到此消息作为邮递员的回复:

  

发生错误

在寄存器运行良好的情况下,我无法理解代码有什么错误?

2 个答案:

答案 0 :(得分:2)

当您调用User.findone函数时,它将尝试查找具有给定电子邮件和未加密密码的用户。

更改此行

User.findOne({ email: req.body.email }, { password: req.body.pass })

与此:

User.findOne({ email: req.body.email })

因此,您将能够获取用户并可以比较哈希密码

答案 1 :(得分:1)

您的错误不是JWT产生的,问题在于bcrypt.compare()返回的是false,这就是为什么您的方法不输入if并将错误消息传递给return的原因。

根据您的代码,我可以提出以下建议:

  • 您必须确保将哈希密码存储在 数据库或您正在执行的过程很好,但是您使用的密码 输入不正确。

  • 在搜索方法中,您使用纯文本密码作为参数 查找用户,在这种情况下,不必输入密码 以不安全的方式存储,这就是使用密码哈希的原因,因此您 应该删除该搜索参数并找到要比较的用户 密码。

    User.findOne({ email: req.body.email })