Паспорт не проходит аутентификацию с «неправильным паролем» перед тем, как фактически вызвать мою функцию passwordMatch - PullRequest
2 голосов
/ 15 марта 2019

Это странно.

Что я пытаюсь сделать

Создайте сервер аутентификации в node.js, используя локальную стратегию Passportjs и JWT. Возможность регистрации аккаунта по электронной почте и паролю, с паролями, хэшированными с помощью «crypto»

Что происходит

Поэтому, когда я вхожу с правильным паролем в ранее существовавшую модель, в APi происходит сбой аутентификации из-за неправильного пароля. Хотя там происходят некоторые странные вещи.

Что я пробовал

По сути, когда я делаю запрос на почту:

  • ОПЦИИ / api / входящие звонки
  • Он проходит через мою конфигурацию паспорта и в типичной функции, где вы проверяете правильность пароля
  • примечание: api / логин POST регистрируется на консоли

Функция в моей конфигурации паспорта:

if (!profileController.passMatch(username, password)) {
            console.log('pass was wrong');
            return done(null, false, {
                message: 'Password is wrong'
            });
        }
  • Вызовы «pass is not» вызваны ошибкой с помощью done (). Хотя в passMatch, как вы увидите ниже, он показывает правильный пароль

Функция passMatch в контроллере профиля:

module.exports.passMatch = (email, password) => {
    User.findOne({email: email}, (err, user) => {
        if (err) { console.log ("error at passMatch: " + err); }
        var hash = crypto.pbkdf2Sync(password, user.salt, 1000, 64, 'sha512').toString('hex');
        console.log(user.hash == hash);
        return (user.hash == hash);
    });
    return false;
};
  • Хотя, если вы заметили консольный журнал, где я проверяю правильность сравнения хешей. Этот лог-оператор выводится на консоль после того, как 'pass was not' зарегистрировано . Он также печатается после того, как вызов passport.authenticate в моей функции входа завершает неудачную аутентификацию в console.log (info)

Функция входа в систему:

module.exports.login = (req, res) => {

    console.log('beginning to authenticate');

    passport.authenticate('local', (err, user, info) => {

        console.log ("authenticating");
        var token;

        // If passport throws an error
        if (err) {
            res.status(404).json(err);
            console.log("error logging in");
            return;
        }

        // If a user is found
        if (user) {

            // Respond with JWT
            token = createJwt(user)
            res.status(200);
            res.json({
                "token": token
            })
            console.log("user logged in");

        // If a user wasn't found
        } else {

            res.status(401).json(info);
            console.log(info);
        }

    })(req, res);

};
  • Ошибка входа в систему не вызывается, но console.log (info) вызывается с сообщением об ошибке из сообщения done () в конфигурации.

Что здесь не так?

1 Ответ

1 голос
/ 15 марта 2019

В функции «passMatch» я снова запрашиваю пользователя (что просто неэффективно), но поскольку эта операция была асинхронной, она пропускалась до оператора «false false» после и в процессе настройки проверки подлинности паспорта , он получил значение false, что привело к сбою аутентификации, но «журнал» возвращался после того, как это заняло больше времени.

Как я это исправил

Я передал объект пользователя, который уже запрашивал паспорт вместо имени пользователя, в passMatch, затем выполнил две операции, чтобы проверить, был ли хеш-код одинаковым, и вернул его, и теперь он работает.

Новый код

module.exports.passMatch = (user, password) => {
    var hash = crypto.pbkdf2Sync(password, user.salt, 1000, 64, 'sha512').toString('hex');
    return user.hash == hash;
};

Также необходимо внести изменения в конфигурацию паспорта для передачи имени пользователя вместо имени пользователя в качестве первого параметра этой функции.

...