@lexstile

Как правильно обработать получение access токена в interceptors на axios?

Есть следующая ситуация, к которой не могу найти подход:
1. Мы вызываем какой-нибудь метод (GET, POST...)
2. В interceptors проверяем токен на просрочку
3. Если токен просрочен, приостанавливаем выполнение текущего запроса
4. Получаем токен
5. Продолжаем выполнение запроса, который запомнили до этого

Возможно есть готовые шаблоны решения подобных задач?
Или какое-либо предложение? Наводка?
Любой информации буду благодарен.

export const http = axios.create();
const currentExecutingRequests = {};

http.interceptors.request.use(
  (req) => {
    let originalRequest = req;

    if (currentExecutingRequests[req.url]) {
      const source = currentExecutingRequests[req.url];
      delete currentExecutingRequests[req.url];
      source.cancel('Отмена запроса');
    }

    const CancelToken = axios.CancelToken;
    const source = CancelToken.source();
    originalRequest.cancelToken = source.token;
    currentExecutingRequests[req.url] = source;

    return originalRequest;
  },
  (err) => {
    return Promise.reject(err);
  }
);
  • Вопрос задан
  • 418 просмотров
Решения вопроса 1
@Bart0725
Мое решение, которое я использую при авторизации к КК

import _ from 'lodash';
const mainFetch = axios.create();

export const issueToken = () => {
    return new Promise((resolve, reject) => {
        return keycloak.updateToken(30000).success((refreshed) => {
            if (refreshed) {
                resolve(keycloak.token);
                sessionStorage.setItem("kctoken", `${keycloak.token}`);
            } else {
                console.log('not refreshed ' + new Date());
            }
        }).error(() => {
            reject();
            keycloakLogout();
        });
    });
}

mainFetch.interceptors.request.use((config) => {
    let originalRequest = config;
    if (keycloak.isTokenExpired(30000)) {
        return issueToken().then((token) => {
            _.set(originalRequest, 'headers.Authorization', `Bearer ${token}`);
            return Promise.resolve(originalRequest);
        });
    } else {
        _.set(config, 'headers.Authorization', `Bearer ${sessionStorage.getItem("kctoken")}`);
    }
    return config;
}, (err) => {
    return Promise.reject(err);
});


Работает оно так, при запросе обращаемся к КК специальным методом isTokenExpired в моем случае за 30 секунд до протухания, если время истекает запрашиваем новый и возвращаем конфиг с новым токеном, если нет - берем токен из сессии
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы