Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import axios from 'axios';
- import jwtDecode from 'jwt-decode';
- const api = axios.create({
- baseURL: BASE_URL_STRING,
- });
- let isRefreshing = false;
- let requestQueue = [];
- // Add a request interceptor
- api.interceptors.request.use(
- async (config) => {
- const accessToken = localStorage.getItem('accessToken');
- const refreshToken = localStorage.getItem('refreshToken');
- // console.log("Hello! I am just checking if the interceptor works or not!");
- if (config.url !== 'login/refresh/') {
- // Only perform token refresh for requests other than 'login/refresh/'
- if (accessToken != undefined && refreshToken != undefined) {
- // Check if access token is still valid
- if (accessToken && refreshToken) {
- if (!isTokenExpired(accessToken)) {
- config.headers.Authorization = `Bearer ${accessToken}`;
- } else {
- if (!isRefreshing) {
- isRefreshing = true;
- // Access token expired, make a request to refresh it
- try {
- const response = await api.post('login/refresh/', { 'refresh': refreshToken });
- const newAccessToken = response.data.data.access;
- const newRefreshToken = response.data.data.refresh;
- // Update the access and refresh token in localStorage or wherever you are storing it
- localStorage.setItem('accessToken', newAccessToken);
- localStorage.setItem('refreshToken', newRefreshToken);
- // Set the new access token in the request headers
- isRefreshing = false;
- // config.headers.Authorization = `Bearer ${newAccessToken}`;
- for(const queueConfig in requestQueue){
- queueConfig.headers.Authorization = `Bearer ${newAccessToken}`;
- await api.request(queueConfig);
- }
- requestQueue = [];
- // return;
- } catch (error) {
- isRefreshing = false;
- requestQueue = [];
- // Handle error refreshing the token (e.g., redirect to login page)
- if (error.response && error.response.data && !error.response.data.success) {
- // Exception occurred
- const { type, code, error: errorMessage } = error.response.data;
- // alert(errorMessage);
- console.log(error);
- console.log(`Error type: ${type}, Error code: ${code}, Error message: ${errorMessage}`);
- }
- }
- } else {
- requestQueue.push(config);
- return new Promise(()=>{})
- }
- }
- }
- else {
- // No access token or refresh token, handle this case (e.g., redirect to login page)
- console.error('No access token or refresh token');
- }
- }
- }
- return config;
- },
- (error) => {
- return Promise.reject(error);
- }
- );
- // Function to check if the token is expired
- function isTokenExpired(token) {
- try {
- const { exp } = jwtDecode(token);
- const currentTime = Date.now() / 1000; // Convert current time to seconds
- // Check if the token expiration time is in the past
- return currentTime > exp;
- } catch (error) {
- // If there is an error decoding the token, consider it as expired
- return true;
- }
- }
- export default api;
Advertisement
Add Comment
Please, Sign In to add comment