pw hash сравнить nodejs - PullRequest
       24

pw hash сравнить nodejs

0 голосов
/ 17 декабря 2018

Я пытаюсь сравнить пароль для моей системы входа в систему с помощью модуля 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 Ответ

0 голосов
/ 17 декабря 2018

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

Попробуйте:

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

...