Как выполнить некоторую логику, если токен JWT отсутствует в заголовке? - PullRequest
0 голосов
/ 23 апреля 2019

Я использую passport-jwt, и есть конечная точка, которая должна возвращать некоторые данные из базы данных, если токен jwt отсутствует в заголовке. Можно ли применить некоторую логику вместо простой отправки Unauthorized 401?

router.get(
    '/get/items',
    passport.authenticate('jwt', {session: false}),
    (req, res) => {
     // reaches this point only after validating token
     ...
    }
);

Таким образом, если присутствует токен jwt, на его основе конечная точка должна вернуть некоторые данные. Если нет, должны быть возвращены некоторые другие данные из базы данных

Ответы [ 3 ]

2 голосов
/ 23 апреля 2019

Я думаю, что пользовательский обратный вызов является опцией.Он передается в качестве последнего параметра методу authenticate(strategy, options, callback) и позволит вам установить желаемое поведение.

Ваш код будет выглядеть следующим образом:

app.get('/get/items', (req, res, next) => {

    passport.authenticate('jwt', { session: false }, (err, user, info) => {
        if (!user) {
            /* 
                Unauthorized accees.
                Handle here the request as u wish
            */

            /* Do some custom logic and return your desired result */
            return res.status(401).json({ success: false, message: 'Unauthorized access!' });
        }

        /* User is authorized. Do other stuff here and return your desired result*/
        return res.status(200).json({ success: true, message: 'Congratulations!' });
    })(req, res, next);

});

В этомНапример, обратите внимание, что authenticate () вызывается из обработчика маршрута, а не используется в качестве промежуточного программного обеспечения маршрута.Это дает обратный вызов для доступа к объектам req и res через замыкание.

Если аутентификация не удалась, для пользователя будет установлено значение false.Если возникла исключительная ситуация, будет установлена ​​ошибка.Будет передан необязательный информационный аргумент, содержащий дополнительные сведения, предоставленные обратным вызовом проверки стратегии.

Обратный вызов может использовать предоставленные аргументы для обработки результата аутентификации по желанию.Обратите внимание, что при использовании пользовательского обратного вызова приложение становится ответственным за установление сеанса (путем вызова req.login ()) и отправки ответа.

Источник

1 голос
/ 23 апреля 2019

Оберните ваше промежуточное ПО и обрабатывайте ошибки так, как вы хотите:

function authenticate(req, res, next) {
  passport.authenticate('jwt', { session: false }, (err, user) => {
    if (err) {
      res.status(err.statusCode || 401).json({ error: err.toString() });
      return;
    }

    if (!user) {
      res.status(404).json({ ... });
      return;
    }

    req.user = user;

    next();
  })(req, res, next);
}

Используйте это вместо:

router.get(
    '/get/items',
    authenticate,
    (req, res) => {
     // reaches this point only after validating token
     ...
    }
);
0 голосов
/ 23 апреля 2019

Ответы @codtex и @Dominic решают проблему.

Я обнаружил, что также работает следующее решение:

router.get(
    '/get/items',
    passport.authenticate('jwt', {session: false}),
    (req, res) => {
        // reaches this point only after validating token
        ...
    },
    (err, req, res, next) => {
        console.log('error handling');
        // reaches this point if validation fails
    }
);
...