pw hash сравнить nodejs

Я пытаюсь сравнить пароль для моей системы входа в систему с помощью модуля bcrypt, однако, похоже, он не работает. Как только я отправляю данные в форму, я получаю {"message":"Internal Server Error"} (которую я определил). Что я делаю не так?

Вот 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 ответ

Вы не должны запрашивать пароль, вы должны запрашивать пользователя. Пароль в вашей БД предположительно зашифрован, поэтому значение, которое приходит от клиента, никогда не будет совпадать. Я предполагаю, что вы пытаетесь сравнить ноль со строкой, из которой, вероятно, происходит ваша ошибка. Тем не менее, полезно зарегистрировать ошибку, чтобы вы точно знали.

Попробуй это:

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() вместо нулевого результата я оставляю это решение вам.

Другие вопросы по тегам