我正在尝试使用带有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",
}
我收到此消息作为邮递员的回复:
发生错误
在寄存器运行良好的情况下,我无法理解代码有什么错误?
答案 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 })