首页 > 解决方案 > 如何从 Node.js 中的数据库中获取哈希密码,以便 bcrypt 可以比较它

问题描述

我有一个注册页面,用户可以在该页面上向数据库发送请求。在发送请求之前,我使用 salt+hash 算法修改了密码。

来自数据库的示例:

用户名 :aUser1234

密码:password12345

散列:$2b$13$dTbz4IeMdeXkqHwCL7Lzqe8NKNyKBvA2mQWk8gnPDLWc4O6hyvew2

我正在尝试从我的数据库中获取散列密码,但我的代码有三个问题。

  1. 一旦验证用户名存在,如何从数据库访问散列密码?
  2. 然后我如何await bcrypt.compare(password, hashedPassowrd);使用getConnection().query()...
  3. 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();
        }
    });
});

标签: mysqlnode.js

解决方案


您需要从数据库中选择散列密码进行比较。

也许是这样的:

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 中)。


推荐阅读