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