Так что у меня проблемы с получением bcrypt для правильного сравнения паролей.Я генерирую соль вне всех функций, хеширую ее внутри функции регистра, пытаюсь сравнить ее в функции входа в систему.Тем не менее, у меня возникают проблемы, это всегда приводит к тому, что я ввел неправильный пароль.Я оставлю большую часть своего кода, чтобы он был читабельным.
const express = require('express');
const db = require('mongodb');
const bcrypt = require('bcryptjs');
const router = express.Router();
let error = {};
const salt = bcrypt.genSaltSync(10);
// register user
router.post('/', async (req, res) => {
const newUser = await userDb();
// Checks for already existing users
let userNameCheck = await newUser.findOne( { 'username': req.body.username });
let userEmailCheck = await newUser.findOne( { 'email': req.body.email });
if (userNameCheck) {
Object.assign(error, {
'usernameExists': 'Username already Exists',
});
}
if (userEmailCheck) {
Object.assign(error, {
'emailExists': 'Email already Exists',
});
}
// Check for illegal characters in username
if (checkSymb(req.body.username) || checkLatin(req.body.username)) {
illegalCharacters = true;
Object.assign(error, {
'illegalCharacters': 'Illegal Characters, please only alpha numeric!',
});
}
if (userNameCheck || userEmailCheck || illegalCharacters) {
res.status(201).send(error);
return;
} else {
const hash = bcrypt.hashSync(req.body.password, salt);
await newUser.insertOne({
email: req.body.email,
username: req.body.username,
password: hash,
},
}).catch(err => {
if (err) {
return err;
}
});
res.status(201).send();
}
});
router.post('/login', async (req, res)=> {
const currentUser = await userDb();
// Check blank
let emailBody = req.body.email.length;
let passBody = req.body.password.length;
if (!emailBody) {
Object.assign(error, {
'blankEmail': 'Email can not be blank!',
});
}
if (!passBody) {
Object.assign(error, {
'blankPassword': 'Password can not be blank!',
});
}
if (!emailBody || !passBody) {
res.status(201).send(error);
}
// See if member exists
const doesExist = await currentUser.findOne({ 'email': `${req.body.email}` });
if (doesExist) {
// if user exists check password
let passGood = bcrypt.compareSync(doesExist.password, salt);
if (passGood) {
console.log('Login Successful');
res.status(201).send();
} else {
console.log('Username or Password incorrect');
Object.assign(error, {
'wrongCredits': 'Username or Password incorrect',
});
res.status(201).send(error);
}
} else {
error = 'This user does not exist';
console.log(error);
res.status(201).send(error);
}
});
async function userDb() {
const client = await db.MongoClient.connect('mongodb://127.0.0.1:27017', {
useNewUrlParser: true
});
return client.db('kog').collection('users');
};
Как видите, я пытаюсь сравнить существующий пароль, чтобы убедиться, что он правильный.Я знаю, что это правильно, так как я держу это простым по причинам тестирования.Я не уверен, почему сравнение не работает, и я знаю, что мне нужно сравнить хэш, но если я попытаюсь сравнить новый хэш, это все равно станет проблемой.
Спасибо!