У меня есть вызов 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 разрешает заголовки, но похоже, что заголовки не пересылаются. Что я делаю не так?
ну, это работает, когда я вызываю экземпляр EC2 напрямую, но это не работает только с API Gateway, я могу попробовать изменить Access-Control-Allow-Origin на мой конкретный веб-сайт
даже при настройке Access-Control-Allow-Origin для моего конкретного сайта я все равно получаю несанкционированный доступ
использование Bearer также не решает проблему, оно работает и с прямым вызовом EC2, я могу оставить его как Bearer, я думаю, если вы считаете, что это лучше, но это не решает проблему
Я только спросил, уверены ли вы, что JWT
— правильный префикс. Каким оно должно быть, полностью зависит от вашей реализации API.
Я добавил код nodejs
Подтвердили ли вы, что в заголовке авторизации отправляется действительный токен?
проблема с кодом вашего сервера в том, что вы не можете определить, какое из двух условий вызывает ответ
@JaromandaX три условия
да, потому что это работает, когда я вызываю экземпляр EC2 напрямую, а не через шлюз API (с тем же токеном)
но вы правы, я мог бы указать более конкретное сообщение об ошибке, но почти уверен, что проблема в том, что заголовок не пересылается шлюзом API
@JaromandaX Я сделал сообщение об ошибке более конкретным, см. редактирование, я так и думал, заголовки не пересылаются
вы имеете в виду один заголовок, вы не можете утверждать, что никакие заголовки не пересылаются
Как ваше промежуточное ПО isAuth
включено в ваш (Express?) API? Возможно, вы неправильно настроили обработчик, и он перехватывает предполетный запрос OPTIONS
, в котором заголовок Authorization
отсутствует.
Похоже, что шлюз API блокирует заголовки, поскольку он работает, если я вызываю EC2 напрямую.
Я добавил console.info для заголовков, вы правы, некоторые заголовки передаются, но не тот, который я установил: {"x-amzn-apigateway-api-id":"xxxxxxxxx","x-amzn-trace-id ":"Root=1-667b5ade-xxxxxxxxxxxxxxxxxx","user-agent":"AmazonAPIGateway_xxxxxxx","accept":"application/json","host":"ec2- xxxxxxx.us-east-2.compute.amazonaws.com:8000","connection":"Keep-Alive"}
@Phil, все работает нормально. Если я вызываю экземпляр EC2 напрямую, он блокируется только в том случае, если я вызываю шлюз API, который ссылается на экземпляр EC2, поэтому я бы сказал, что он, вероятно, включен правильно, на самом деле похоже, что шлюз API не пересылает заголовки правильно
Порадуйте меня и запишите req.method
неважно, нашел решение, посмотри мой ответ
Авторизация JWT поддерживается для шлюза HTTP API. Для REST API вам необходимо использовать API Gateway Lambda Authorizer.
Я нашел решение, спасибо за вашу попытку, смотрите мой ответ
У вас есть несколько проблем... 1) GET-запросы не имеют основного содержимого, так почему вы устанавливаете заголовок типа контента? 2)
Access-Control-Allow-Credentials: true
иAccess-Control-Allow-Origin: *
— недопустимая конфигурация CORS. Это вызовет проблемы. 3) Вы уверены, что значение заголовкаAuthorization
должно иметь префиксJWT
? Обычно этоBearer