即使密码匹配,bcrypt 也会失败...>
bcrypt fails even when passwords match...>
使用 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 match\n')
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 })
};
});
这是所有console.logs的输出:
服务器正在端口上运行:3443
检查密码是否匹配
(这是 bcrypt.compare 的部分)
显示密码变量:
只是密码变量:$2a$10$mXTzEmSqPoaEsPbvM3P/o.cl7VyMhVq7S37u8Lpo8gGr6i0tS8OxS
User.Password 变量:$2a$10$mXTzEmSqPoaEsPbvM3P/o.cl7VyMhVq7S37u8Lpo8gGr6i0tS8OxS
isMatch 的显示值:
假
密码不匹配!关闭连接
我只是不明白为什么 isMatch returns 为 false,console.logs 的输出完全相同但是 isMatch returns 的值为 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 match\n')
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
放错地方了请见谅
使用 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 match\n')
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 })
};
});
这是所有console.logs的输出:
服务器正在端口上运行:3443
检查密码是否匹配 (这是 bcrypt.compare 的部分)
显示密码变量:
只是密码变量:$2a$10$mXTzEmSqPoaEsPbvM3P/o.cl7VyMhVq7S37u8Lpo8gGr6i0tS8OxS User.Password 变量:$2a$10$mXTzEmSqPoaEsPbvM3P/o.cl7VyMhVq7S37u8Lpo8gGr6i0tS8OxS
isMatch 的显示值: 假
密码不匹配!关闭连接
我只是不明白为什么 isMatch returns 为 false,console.logs 的输出完全相同但是 isMatch returns 的值为 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 match\n')
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
放错地方了请见谅