Я использую reactjs, mbox и axios и столкнулся с проблемой. У меня есть api, который выдает токен доступа и токен обновления. Токен доступа умирает каждые 20 минут, и когда это происходит, сервер отправляет обратно 401, и мой код автоматически отправляет токен обновления, чтобы получить новый токен доступа.
Как только будет предоставлен новый токен доступа, тот же отклоненный запрос будет отправлен снова. Теперь мой код отлично работает, пока я не выброшу несколько отказов, которые могут сработать одновременно.
Итак, первый запрос уходит, 401 отправляется обратно, и он получает новый токен обновления, ну, все остальные запросы будут пытаться сделать то же самое, но другие запросы теперь будут терпеть неудачу, потому что будет использоваться токен обновления и новый. будет выдан по первому запросу.
Это запустит мой код для перенаправления пользователя на страницу входа.
По сути, я застрял только в одном запросе за раз.
export const axiosInstance = axios.create({
baseURL: getBaseUrl(),
timeout: 5000,
contentType: "application/json",
Authorization: getAuthToken()
});
export function updateAuthInstant() {
axiosInstance.defaults.headers.common["Authorization"] = getAuthToken();
}
function getAuthToken() {
if (localStorage.getItem("authentication")) {
const auth = JSON.parse(localStorage.getItem("authentication"));
return `Bearer ${auth.accessToken}`;
}
}
axiosInstance.interceptors.response.use(
function(response) {
return response;
},
function(error) {
const originalRequest = error.config;
if (error.code != "ECONNABORTED" && error.response.status === 401) {
if (!originalRequest._retry) {
originalRequest._retry = true;
return axiosInstance
.post("/tokens/auth", {
refreshToken: getRefreshToken(),
grantType: "refresh_token",
clientId : "myclient"
})
.then(response => {
uiStores.authenticaionUiStore.setAuthentication(JSON.stringify(response.data))
updateAuthInstant();
return axiosInstance(originalRequest);
});
} else {
uiStores.authenticaionUiStore.logout();
browserHistory.push({ pathname: '/login',});
}
}
return Promise.reject(error);
}
);
Редактировать
У меня проблема с тем, что код, который мне нужно проверить для сброса аутентификации, не работает, когда пользователь копирует прямой URL-адрес
app.js
<React.Fragment>
<Switch>
<Route path="/members" component={MemberAreaComponent} />
</Switch>
</React.Fragment >
В memberAreaComponent
<Route path="/members/home" component={MembersHomeComponent} />
Когда я набираю http://www.mywebsite/members/home
MembersHomeComponent - componentDidMount runs first
MemberAreaComponent - componentDidMount runs second
AppCoontainer = componentDidMount runs last.