Я звоню в проект веб-API из приложения React. API использует JWT для аутентификации. Если приложение предоставляет API с токеном JWT с истекшим сроком действия, оно получает ожидаемый ответ 401, но заголовок 'www-authentication' (который включает в себя сообщение о том, что причина 401 связана с токеном с истекшим сроком действия).
Если я запускаю Fiddler во время запроса и проверяю ответ, я вижу, что присутствует заголовок:
HTTP/1.1 401 Unauthorized
Date: Wed, 22 Apr 2020 01:07:32 GMT
Server: Kestrel
Content-Length: 0
WWW-Authenticate: Bearer error="invalid_token", error_description="The token expired at '04/21/2020 17:33:17'"
Access-Control-Allow-Origin: *
Но объект ответа на ошибку, полученный моим приложением React (которое использует ax ios для вызова API) не имеет заголовка 'www-authenticate':
Ответ, как показано в консоли
Вот код вызова:
async function getAllParts() {
const gpuUrl = urls.apiGetGpuUrl;
const moboUrl = urls.apiGetMoboUrl;
const cpuUrl =urls.apiGetCpuUrl;
const ramUrl =urls.apiGetRamUrl;
const requestOptions = {
method: 'GET',
headers: authHeader()
};
const gpuData = axios.get(gpuUrl, requestOptions);
const moboData = axios.get(moboUrl, requestOptions);
const cpuData = axios.get(cpuUrl, requestOptions);
const ramData = axios.get(ramUrl, requestOptions);
try{
const response = await Promise.all([gpuData, moboData, cpuData, ramData]);
return handleMultipleResponses(response);
} catch(error){
console.log(error); // This error contains a response object with no 'www-authenticate' header
}
}
Как уже упоминалось, я могу видеть из Fiddler, что ответ содержит заголовок, но как я могу получить к нему доступ из своего приложения? Вызов API от почтальона дает ожидаемый результат с присутствующим заголовком:
Ответ, как показано в Почтальоне
Любая помощь будет принята с благодарностью.
РЕДАКТИРОВАТЬ:
Просто добавить для пояснения, в коде вызова, функция 'authHeader ()' устанавливает заголовок следующим образом:
export function authHeader() {
let user = JSON.parse(localStorage.getItem('user'));
if (user && user.token) {
return { 'Authorization': 'Bearer ' + user.token }; //
} else {
return {};
}
}
Я считаю, что это будет установлено правильно, так как данные успешно извлекаются, когда срок действия JWT не истек.