mysql - 如何从 Node.js 中的数据库中获取哈希密码,以便 bcrypt 可以比较它
问题描述
我有一个注册页面,用户可以在该页面上向数据库发送请求。在发送请求之前,我使用 salt+hash 算法修改了密码。
来自数据库的示例:
用户名 :aUser1234
密码:password12345
散列:$2b$13$dTbz4IeMdeXkqHwCL7Lzqe8NKNyKBvA2mQWk8gnPDLWc4O6hyvew2
我正在尝试从我的数据库中获取散列密码,但我的代码有三个问题。
- 一旦验证用户名存在,如何从数据库访问散列密码?
- 然后我如何
await bcrypt.compare(password, hashedPassowrd);
使用getConnection().query()...
router.post
回调函数也需要吗async
?
router.post('/user_login', async (req, res) => { //Does this needs to be an async callback function?
const username = req.body.thisUsername; //aUser1234
const password = req.body.thisPassword; //password12345
const sqlString = "SELECT username FROM student_demographics WHERE username = ?";
getConnection().query(sqlString, [username], async (err, results, fields) => {
if(err){
res.sendStatus(500);
}
if(results.length){
console.log("NO ERRORS HERE"); //WORKS OKAY UNTIL HERE
//HOW TO GET HASHED PASSWORD AND STORE IT ON VARIABLE
const isValid = await bcrypt.compare(password, hashedPassowrd); //ERROR
if(isValid){
//PASSWORD MATCHED
res.redirect('/homePage.html');
res.end();
}else{
//PASSWORD DIDN'T MATCH
res.redirect('/login.html');
}
}else{ //THE USERNAME DOES NOT exists
console.log(" > The username or password are invalid :(")
res.redirect('/login.html');
res.end();
}
});
});
解决方案
您需要从数据库中选择散列密码进行比较。
也许是这样的:
router.post("/user_login", (req, res) => {
const username = req.body.thisUsername; //aUser1234
const password = req.body.thisPassword; //password12345
const sqlString = "SELECT hashed_password FROM student_demographics WHERE username = ? LIMIT 1";
getConnection().query(sqlString, [username], async (err, results, fields) => {
if (err) {
console.log(err);
res.sendStatus(500);
return;
}
if (!results.length) {
console.log(" > The username is invalid :(");
res.redirect("/login.html");
res.end();
return;
}
const [hashedPassword] = results[0];
const isValid = await bcrypt.compare(password, hashedPassword);
if (isValid) {
//PASSWORD MATCHED
res.redirect("/homePage.html");
res.end();
} else {
console.log(" > The password is invalid :(");
res.redirect("/login.html");
res.end();
return;
}
});
});
请注意,您并没有对登录信息做任何事情(您可能希望将其保存在会话或 cookie 中)。
推荐阅读
- c# - 使用反序列化 XML 文件中的多字段 List<> 填充第二个单字段列表 (Xamarin)
- java - JSON 在全选中抛出 java.lang.StackOverflowError
- c# - 在 C# 中使用 Python 库
- javascript - 用于处理日期选择器下拉列表的 JavaScript 对象(三个不同的下拉列表)
- webpack - Webpack 4 - 父文件夹中的 node_modules。如何创建供应商块?
- php - 如果使用 HTML,TCPDF MultiCell 会忽略 valign
- c# - RabbitMQ C# 客户端可扩展?
- apache-spark - Spark shuffle 阻止复制
- rest - 运行在不同 Docker 容器中的 Spring Boot 应用程序拒绝连接
- vim - 在 pipenv 中从 vim ALE 运行 Pylint 和 MyPy 时出现错误的导入错误。-- :!pylint % 有效 -- :!mypy % 有效