pw哈希比较nodejs

时间:2018-12-17 15:28:01

标签: node.js hash bcrypt

我正在尝试使用bcrypt模块比较我的登录系统的密码,但是似乎不起作用。一旦将数据提交到表单中,我就会收到{“ message”:“内部服务器错误”}(已定义)。我在做什么错了?

这是auth-controller.js:

var mysqlConnection = require ('../config');
const bcrypt = require ('bcrypt');

module.exports.auth = async function (req, res) { 
  var password = req.body.password
  var email = req.body.email
  console.log(email, password);

let pwComparison

try {
  //Check the password
  pwComparison = await pwCompare(password)

  //Compare the hashed password
  password = await bcrypt.compare(password,results)

} catch (e) {
  return res.status(500).json({message: 'Internal Server Error'})
}

if (pwComparison) {
  res.redirect('/')
}

async function pwCompare(password) {

  let query = `SELECT password FROM users where password = ${password}`

  return new Promise((resolve,reject)=> {
    mysqlConnection.query(query, function(error,results) {
      if (error) {
        return reject (error)
      }

      return resolve(results)
    })
  })
}}

1 个答案:

答案 0 :(得分:0)

您不应查询密码,而应查询用户。数据库中的密码大概是加密的,因此来自客户端的值将永远不会匹配。我猜您正在尝试将null与字符串进行比较,这可能是您的错误出处。但是,这对于记录错误很有帮助,因此您将肯定知道。

尝试一下:

module.exports.auth = async function (req, res) { 
  const password = req.body.password
  const email = req.body.email
  console.log(email);

let user = null;
let isMatch = false;

try {
  //Check the password
  user = await getUserByEmail(email)

  //Compare the hashed password
  isMatch = await bcrypt.compare(password, user.password)

} catch (e) {
  return res.status(500).json({message: 'Internal Server Error'})
}

if (isMatch) {
  req.user = user;
  res.redirect('/');
}

async function getUserByEmail(email) {

  let query = "SELECT password FROM users where email = ? LIMIT 1";

  return new Promise((resolve,reject)=> {
    mysqlConnection.query(query, [email], function(error,results) {
      if (error) {
        return reject (error)
      }
      if (results.length == 1) 
         return resolve(results[0])
      else
         return resolve(null)
    });
  })
}}

根据您的评论进行更新。

好吧,我对查询的思念;您将返回与查询匹配的用户数组,这意味着仅一个数组。无论如何,您都需要从该阵列获取实际用户。

我已经更新了查询,以将搜索限制为单个用户(即使您只有唯一的电子邮件地址,也可以得到很小的性能提升),还可以查询回调以返回单个返回的行而不是数组。有人可能会说,找不到用户应该是reject()而不是空结果,我将这个决定留给您。