Токен JWT с API-шлюзом постоянно возвращает несанкционированный доступ

У меня есть вызов axios с использованием токена JWT, который работает, когда я вызываю экземпляр EC2 напрямую, но когда я вызываю его через шлюз API, он возвращает:

success:    false
message:    "unauthorized access! no headers!"

вот код nodejs:

exports.isAuth = async (req, res, next) => {
  if (req.headers && req.headers.authorization) {
    const token = req.headers.authorization.split(' ')[1];

    try {
      const decode = jwt.verify(token, process.env.JWT_SECRET);
      const user = await User.findById(decode.userId);
      if (!user) {
        return res.json({ success: false, message: 'unauthorized access!' });
      }

      req.user = user;
      next();
    } catch (error) {
      if (error.name === 'JsonWebTokenError') {
        return res.json({ success: false, message: 'unauthorized access!' });
      }
      if (error.name === 'TokenExpiredError') {
        return res.json({
          success: false,
          message: 'sesson expired try sign in!',
        });
      }

      res.res.json({ success: false, message: 'Internal server error!' });
    }
  } else {
    res.json({ success: false, message: 'unauthorized access! no headers!' });
  }
};

вот код Reactjs:

const headers = {
   Accept: 'application/json',
   'Content-Type': 'multipart/form-data',
   authorization: `JWT ${token}`,
};

return axios.get(BE_URI + "/fetch-general-news", { headers });

Однако я убедился, что конечная точка шлюза API разрешает заголовки, но похоже, что заголовки не пересылаются. Что я делаю не так?

У вас есть несколько проблем... 1) GET-запросы не имеют основного содержимого, так почему вы устанавливаете заголовок типа контента? 2) Access-Control-Allow-Credentials: true и Access-Control-Allow-Origin: * — недопустимая конфигурация CORS. Это вызовет проблемы. 3) Вы уверены, что значение заголовка Authorization должно иметь префикс JWT? Обычно это Bearer

Phil 26.06.2024 01:14

ну, это работает, когда я вызываю экземпляр EC2 напрямую, но это не работает только с API Gateway, я могу попробовать изменить Access-Control-Allow-Origin на мой конкретный веб-сайт

Phil 26.06.2024 01:22

даже при настройке Access-Control-Allow-Origin для моего конкретного сайта я все равно получаю несанкционированный доступ

Phil 26.06.2024 01:25

использование Bearer также не решает проблему, оно работает и с прямым вызовом EC2, я могу оставить его как Bearer, я думаю, если вы считаете, что это лучше, но это не решает проблему

Phil 26.06.2024 01:34

Я только спросил, уверены ли вы, что JWT — правильный префикс. Каким оно должно быть, полностью зависит от вашей реализации API.

Phil 26.06.2024 01:35

Я добавил код nodejs

Phil 26.06.2024 01:41

Подтвердили ли вы, что в заголовке авторизации отправляется действительный токен?

Jaromanda X 26.06.2024 01:41

проблема с кодом вашего сервера в том, что вы не можете определить, какое из двух условий вызывает ответ

Jaromanda X 26.06.2024 01:42

@JaromandaX три условия

Phil 26.06.2024 01:43

да, потому что это работает, когда я вызываю экземпляр EC2 напрямую, а не через шлюз API (с тем же токеном)

Phil 26.06.2024 01:44

но вы правы, я мог бы указать более конкретное сообщение об ошибке, но почти уверен, что проблема в том, что заголовок не пересылается шлюзом API

Phil 26.06.2024 01:45

@JaromandaX Я сделал сообщение об ошибке более конкретным, см. редактирование, я так и думал, заголовки не пересылаются

Phil 26.06.2024 01:52

вы имеете в виду один заголовок, вы не можете утверждать, что никакие заголовки не пересылаются

Jaromanda X 26.06.2024 01:58

Как ваше промежуточное ПО isAuth включено в ваш (Express?) API? Возможно, вы неправильно настроили обработчик, и он перехватывает предполетный запрос OPTIONS, в котором заголовок Authorization отсутствует.

Phil 26.06.2024 01:59

Похоже, что шлюз API блокирует заголовки, поскольку он работает, если я вызываю EC2 напрямую.

Phil 26.06.2024 02:01

Я добавил console.info для заголовков, вы правы, некоторые заголовки передаются, но не тот, который я установил: {"x-amzn-apigateway-api-id":"xxxxxxxxx","x-amzn-trace-id ":"Ro‌​ot=1-667b5ade-xxxxxx‌xxxxxxxxxxxx","user-‌​agent":"AmazonAPIGat‌​eway_xxxxxxx","accep‌​t":"application/json‌​","host":"ec2- xxxxxx‌​x.us-east-2.compute.‌​amazonaws.com:8000",‌​"connection":"Keep-A‌​live"}

Phil 26.06.2024 02:09

@Phil, все работает нормально. Если я вызываю экземпляр EC2 напрямую, он блокируется только в том случае, если я вызываю шлюз API, который ссылается на экземпляр EC2, поэтому я бы сказал, что он, вероятно, включен правильно, на самом деле похоже, что шлюз API не пересылает заголовки правильно

Phil 26.06.2024 02:10

Порадуйте меня и запишите req.method

Phil 26.06.2024 02:15

неважно, нашел решение, посмотри мой ответ

Phil 26.06.2024 02:21
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
19
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Авторизация JWT поддерживается для шлюза HTTP API. Для REST API вам необходимо использовать API Gateway Lambda Authorizer.

Я нашел решение, спасибо за вашу попытку, смотрите мой ответ

Phil 26.06.2024 02:24
Ответ принят как подходящий

Нашел! спасибо за вашу помощь, ребята, поэтому я оставлю решение на случай, если кто-то еще будет заблокирован, вам нужно добавить заголовок, который вы хотите, чтобы шлюз AWS API пересылал, в «Запрос метода» вашей конечной точки, чтобы он был перенаправлен:

Другие вопросы по теме