Я создаю избыточное промежуточное программное обеспечение для обновления токена перед любым запросом, если срок действия токена истек.
Проблема в том, что после первого вызова я всегда получаю error 400 bad request
, но если выполнялся другой вызов (это разбиение на страницыrequrest) он работает нормально, потому что токен был обновлен.
Я заметил, что запрос Axios запускается до того, как новый токен поступает, и до установки нового заголовка авторизации Axios, поэтому я попытался сделать промежуточное ПО асинхронным ожиданием, но все жене повезло ...
import {
getJWT,
isTokenExpired
} from "../util/helpers";
import Cookies from "js-cookie";
import axios from "axios";
const refreshTokenMiddleware = store => next => async action => {
if (!action.excludeFromRefresh) {
const token = getJWT();
if (token && isTokenExpired()) {
try {
const { data } = await axios.post("auth/refresh");
axios.defaults.headers.common[
"Authorization"
] = `Bearer ${data.data.access_token}`;
Cookies.set("AppToken", data.data.access_token);
next(action);
} catch (error) {
console.log(error);
}
} else {
next(action);
}
} else {
next(action);
}
};
export default refreshTokenMiddleware;
Я также подозреваю, что запрос Axios вызывается со старым токеном в первый раз.
Что я здесь не так делаю?
=====================
Редактировать
Я попытался объединить промежуточное программное обеспечение все вместе и реализовать перехватчики axios, так как промежуточное программное обеспечение неперехватить запрос axios ...
axios.interceptors.request.use(
function(config) {
// Do something before request is sent
if (
config.url !== "auth/refresh" &&
config.url !== "auth/login" &&
config.url !== "auth/register"
) {
const token = getJWT();
if (token && isTokenExpired()) {
axios.post("auth/refresh").then(res => {
config.headers.Authorization = `Bearer ${res.data.data.access_token}`;
console.log(
"Inside the refresh in interceptor",
res.data.data.access_token
);
return config;
});
}
}
return config;
},
function(error) {
// Do something with request error
return Promise.reject(error);
}
);
Но это также, похоже, не работает, запрос запускается со старым токеном в заголовке авторизации в первый раз.
Что можетЯ делаю?