使用bcryptjs比较密码时出现问题。
环境:
节点:v16.8.0
bcryptjs:2.4.3
https:1.0.0-(网站/页面都是https,以防有任何不同(。
这就是代码的样子:
// Login Function
router.post('/login', async (req, res) => {
const { password, email } = req.body;
let user = users.find((user) => {
return user.email === email
});
// Checks that the user is already registered
if (!user) {
return res.status(400).json({
"errors": [
{
"msg": "Invalid Credentials"
}
]
})
};
// Compare Passwords
console.log('Checking if passwords matchn')
let isMatch = await bcrypt.compare(password, user.password);
console.log('Displaying Password variables:')
console.log(`Just password Variable: ${password}`)
console.log(`User.Password variable: ${user.password}`)
console.log('nDisplaying Value of isMatch:')
console.log(`${isMatch}n`)
if (!isMatch) {
console.log(`The Passwords dont match! Closing Connection`)
return res.status(400).json({
"errors": [
{
"msg": "The Passwords do not match!"
}
]
});
} else {
console.log(`Moving on to the JWT thingy`)
const token = await jwt.sign({
email
}, process.env.JWT_SECRET, {
expiresIn: 360000
})
return res.json({ token })
};
});
这是所有控制台的输出。logs:
服务器正在端口3443 上运行
检查密码是否匹配(这是进行bcrypt.compare的部分(
显示密码变量:
仅密码变量:$2a$10$mXTzEmSqPoaEsPbvM3P/o.cl7VyMhVq7S37u8Lpo8gGr6i0tS8OxS用户密码变量:$2a$10$mXTzEmSqPoaEsPbvM3P/o.cl7VyMhVq7S37u8Lpo8gGr6i0tS8OxS
显示isMatch的值:错误
密码不匹配!关闭连接
我只是不明白为什么isMatch返回false,console.log的输出完全相同,但isMatch的值返回false,因此遵循!isMatch路由,而不是进入JWT部分。
我试过使用bcryptjs.hashSync((和bcryptjs.compareSync,但没有区别。
有什么想法吗?干杯M.
bcrypt.compare
采用纯文本密码和密码哈希。您的代码正在传递两个密码哈希。所以字符串是相等的,但是第一个字符串的散列不等于第二个字符串。
// Login Function
router.post('/login', async (req, res) => {
const { password, email } = req.body;
let user = users.find((user) => {
return user.email === email
});
// Checks that the user is already registered
if (!user) {
return res.status(400).json({
"errors": [
{
"msg": "Invalid Credentials"
}
]
})
};
// Compare Passwords
console.log('Checking if passwords matchn')
if (password === user.password) {
console.log('Displaying Password variables:')
console.log(`Just password Variable: ${password}`)
console.log(`User.Password variable: ${user.password}`)
console.log('nDisplaying Value of isMatch:')
console.log(`${isMatch}n`)
if (!isMatch) {
console.log(`The Passwords dont match! Closing Connection`)
return res.status(400).json({
"errors": [
{
"msg": "The Passwords do not match!"
}
]
});
}
} else {
console.log(`Moving on to the JWT thingy`)
const token = await jwt.sign({
email
}, process.env.JWT_SECRET, {
expiresIn: 360000
})
return res.json({ token })
};
});
我已经将您的代码编辑为不为bcrypt.compare
,因为如上面的答案所述,compare
采用纯文本字符串,并将其与bcrypt
哈希版本进行比较。因此,由于两者都是散列的,一个正则if语句就足够了。如果我把关闭的if
支架放错了的位置,请原谅我