Express. js JWT всегда возвращает ошибку по умолчанию 404 при успешной авторизации - PullRequest
0 голосов
/ 09 февраля 2020

Я пытаюсь выполнить авторизацию JWT, но она возвращает Express. js страницу ошибки по умолчанию 404 (страница HTML не мой определенный обработчик ошибок) в КАЖДОМ запросе, когда авторизация прошла успешно.

Этого не произойдет, если токена нет или он недействителен. Несанкционированная ошибка и все маршруты работают нормально без заголовка токена.

Я очень подозреваю, что проблема в return next() в authHandler, но я не знаю причину.

Порядок промежуточного программного обеспечения в приложении. js:

//Authorization
app.use(authHandler);

//Routes
app.use(routes);

//Method 404 middleware
app.use(errorHandler.notFound);

//Generic error handler middleware
app.use(errorHandler.generic);

authHandler:

const jwt = require('jsonwebtoken');

exports.userHeader = async (req, _res, next) => {
  if (req.headers && req.headers.authorization) {
    jwt.verify(
      req.headers.authorization,
      process.env.JWT_SECRET,
      (err, decode) => {
        if (!err) {
          req.user = decode;
          return next();
        }
      }
    );
  }

  req.user = undefined;
  return next();
};

Защищенный маршрут:

posts.get('/', user_handler.login_required, post_controller.index);

login_required обработчик:

async (req, _res, next) => {
  if (req.user) {
    return next();
  }

  let error = new Error('Unauthorized');
  error.status = 401;
  return next(error);
};

Ответ об ошибке:

<!DOCTYPE html>



    
    Error



    Cannot GET /posts

Ответы [ 2 ]

2 голосов
/ 10 февраля 2020

Я проверил ваш код. Это сработало правильно, немного изменив для меня. просто поместите req.user = undefined; return next(); в другом выражении, как это else{ req.user = undefined; return next();}

0 голосов
/ 10 февраля 2020

Проблема в authHandler. next() должен находиться во внешней области видимости if, иначе он не будет работать. Я не знаю, как именно это создало такую ​​проблему, но похоже, что контекст выполнения или что-то другое, поэтому express вызывает ошибку.

Было бы замечательно, если бы кто-то мог демистифицировать эту ситуацию.

authHandler:

const jwt = require('jsonwebtoken');

exports.userHeader = async (req, _res, next) => {
  if (req.headers && req.headers.authorization) {
    jwt.verify(
      req.headers.authorization,
      process.env.JWT_SECRET,
      (err, decode) => {
        if (!err) {
          req.user = decode;
        }
      }
    );

    return next(); // This needs to be here
  }

  req.user = undefined;
  return next();
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...