Как мне получить зашифрованный пароль из моей базы данных с помощью bcrypt? - PullRequest
1 голос
/ 18 июня 2020

У меня есть приложение с регистрационной формой и формой входа. Мне удалось получить зашифрованный пароль в базе данных, но я не могу заставить его работать, когда я хочу сравнить его при входе в систему. Как мне реализовать bcrypt в моем методе публикации входа?

Вот мой регистрационный пост, в котором успешно хранится пароль:

router.post('/register', (req, res) => {
bcrypt.hash(req.body.password, 10).then((hash) => {
    let userData = req.body;
    let user = new User(userData);
    user.password = hash;
    user.save((error, registeredUser) => {
        if (error) {
            console.log(error);
        } else {
            let payload = {subject: registeredUser._id};
            let token = jwt.sign(payload, 'secretKey');
            res.status(200).send({token});
        }
    });
  });
});

А вот мой логин:

router.post('/login', (req, res) => {
let userData = req.body;

User.findOne({email: userData.email}, (error, user) => {
    if (error) {
        console.log(error);
    } else {
        if(!user) {
            res.status(401).send('Invalid Email');
        } else
        if (user.password !== userData.password) {
            res.status(401).send('Invalid Password');
        } else {
            let payload = {subject: user._id};
            let token = jwt.sign(payload, 'secretKey');
            res.status(200).send({token});
        }
    }
  });
});

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Я понял это и теперь успешно сравниваю хешированные пароли. Вот новое сообщение для входа:

router.post('/login', (req, res) => {
let userData = req.body;

User.findOne({email: userData.email}, (error, user) => {
    if (error) {
        console.log(error);
    } else {
        if(!user) {
            res.status(401).send('Invalid Email');
        } else {
        bcrypt.compare(req.body.password, user.password, function (err, result) {
            if (result == false) {
                res.status(401).send('Invalid Password');
            } else {
                let payload = {subject: user._id};
                let token = jwt.sign(payload, 'secretKey');
                res.status(200).send({token});
            }
        });
    }}
  });
});
0 голосов
/ 18 июня 2020

Здесь следует отметить несколько моментов.

  1. Пароль обычно зашифровывается с использованием функции одностороннего хеширования , что означает, что вы не должны рассчитывать на расшифровку сохраненного пароль обратно к исходному тексту.

  2. В одностороннем порядке функция ha sh, каждый раз для одного и того же ввода создается один и тот же ha sh (вывод с шифрованием). Например: если вы можете зашифровать слово «mysimplepassword», на выходе будет каждый раз одно и то же «xjjklqjlj34309dskjle4» (просто образец).

  3. Метод проверки пароля в таком Сценарий ios: (a) Сохраните зашифрованный пароль (ha sh) при его первом вводе (обычно во время регистрации) (b) Во время входа в систему получите пароль как ввод и зашифруйте его, используя тот же метод шифрования, чтобы получить хэш (c) Сравните ha sh

Если вы используете bcrypt, вы можете использовать bcrypt.compare() для выполнения этих операций

...