freeleaps_frontend/frontend/src/utils/backend/axios.js

76 lines
2.3 KiB
JavaScript

import axios from 'axios'
import { jwtDecode } from 'jwt-decode';
const backendAxios = axios.create({
baseURL: '',
headers: {
'Content-Type': 'application/json'
}
})
// Function to check if the token has expired
function isTokenExpired(token) {
// Ensure token is a non-empty string
if (!token || typeof token !== 'string') {
console.error('Invalid token: must be a non-empty string')
return true // Treat it as expired
}
try {
const decodedToken = jwtDecode(token)
console.log('this is decoded token', decodedToken)
const now = Math.floor(Date.now() / 1000)
// Buffer as 5 minu = 300 seconds
return decodedToken.exp - 300 < now
} catch (error) {
console.error('Error decoding token:', error)
return true // Treat it as expired if decoding fails
}
}
// Interceptor for handling token expiration and refreshing
backendAxios.interceptors.request.use(
async (config) => {
let accessToken = localStorage.getItem('access_token')
const refreshToken = localStorage.getItem('refresh_token')
// Check if the access token is expired
if (!accessToken || isTokenExpired(accessToken)) {
if (!refreshToken) {
return config
}
try {
// If access token is expired, refresh it using the refresh token
const response = await axios.post('/api/user/signin/refresh-token', {}, {
headers: {
Authorization: `Bearer ${refreshToken}`,
'Content-Type': 'application/json'
}
});
accessToken = response.data.access_token
const new_refreshToken = response.data.refresh_token
// Save the new access token to localStorage
localStorage.setItem('access_token', accessToken)
localStorage.setItem('refresh_token', new_refreshToken)
} catch (error) {
console.error('Token refresh failed. Redirecting to login.')
// Optionally, handle token refresh failure (e.g., redirect to login)
window.location.href = '/front-door'
return Promise.reject(error)
}
}
// Add the (new) access token to the request headers
if (accessToken) {
config.headers.Authorization = `Bearer ${accessToken}`
}
return config
},
(error) => {
return Promise.reject(error)
}
)
export { backendAxios }