Files
modoboa/frontend/src/api/repository.js
T

74 lines
2.1 KiB
JavaScript

import axios from 'axios'
import Cookies from 'js-cookie'
import router from '@/router'
import { useAuthStore } from '@/stores'
const _axios = axios.create()
_axios.interceptors.request.use(
function (config) {
const authStore = useAuthStore()
if (authStore.isAuthenticated) {
config.headers['Accept-Language'] = authStore.authUser.language
config.headers['Authorization'] = `Bearer ${authStore.getAccessToken()}`
}
return config
},
function (error) {
// Do something with request error
return Promise.reject(error)
}
)
// Add a response interceptor
_axios.interceptors.response.use(
function (response) {
// Do something with response data
return response
},
function (error) {
if (error.response.status === 418) {
router.push({ name: 'TwoFA' })
return Promise.reject(error)
}
if (error.response.status === 429) {
return Promise.reject(error)
}
if (error.response.status !== 401 || router.currentRoute.name === 'Login') {
return Promise.reject(error)
}
const refreshToken = Cookies.get('refreshToken')
const authStore = useAuthStore()
if (error.config.url.endsWith('/token/refresh/') || !refreshToken) {
authStore.$reset()
if (router.currentRoute.name !== 'Login') {
router.push({ name: 'Login' })
}
return Promise.reject(error)
}
return _axios
.post('/token/refresh/', { refresh: refreshToken })
.then((resp) => {
Cookies.set('token', resp.data.access, { sameSite: 'strict' })
_axios.defaults.headers.common.Authorization = `Bearer ${resp.data.access}`
const config = error.config
config.headers.Authorization = `Bearer ${resp.data.access}`
return new Promise((resolve, reject) => {
_axios
.request(config)
.then((resp) => {
resolve(resp)
})
.catch((error) => {
reject(error)
})
})
})
.catch((error) => {
Promise.reject(error)
})
}
)
export default _axios