Перехватчик Axios для обновления токена

#javascript #vue.js #axios #jwt

Вопрос:

На серверной части я реализовал аутентификацию JWT с помощью файлов cookie HttpOnly. На интерфейсе я использую axios для использования REST API из бэкенда.

Логин и авторизация пока работают хорошо, но у меня проблема с перехватчиком axios. Перехватчик должен перехватить 401 ответ и вызвать конечную точку маркера обновления для получения нового маркера доступа. Если токен обновления действителен, все работает хорошо. Если срок действия токена обновления истек, пользователь должен выйти из системы с сайта.

Экземпляр Axios

 import axios from 'axios'

const apiClient = axios.create({
  baseURL: process.env.VUE_APP_API_BASE_URL || 'http://localhost:8000/api',
  headers: {
    Accept: 'application/json',
    'Content-Type': 'application/json',
  },
  xsrfCookieName: 'csrftoken',
  xsrfHeaderName: 'X-CSRFTOKEN',
  withCredentials: true,
})

export default apiClient

 

Код перехватчика

 import api from './apiClient'
import router from '@/router'

const setup = (store) => {
  api.interceptors.response.use(
    (res) => {
      return res
    },
    async (err) => {
      const originalRequest = err.config

      if (err.response.status !== 401) {
        return Promise.reject(err)
      }

      if (originalRequest.url === '/auth/token/refresh/') {
        store.dispatch('auth/logout')
        await router.push({ name: 'Login' })
        return Promise.reject(err)
      }

      // TRY TO REFRESH TOKEN
      await api.post('/auth/token/refresh/')
      return api(originalRequest)
    }
  )
}

export default setup
 

Если срок действия токена обновления истек, то вызовы api дублируются.
введите описание изображения здесь

Я мог бы использовать другой экземпляр Axios без перехватчика для вызова конечной точки API, для которой не требуется аутентификация. Но с помощью файлов cookie HttpOnly это невозможно, потому что во внешнем интерфейсе у меня нет прямого доступа к токену обновления. Я уже пытаюсь окружить вызов токена обновления try/catch, но это не работает