Guest User

How to modify for multiple requests, get refresh token!

a guest
Dec 12th, 2023
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import axios from 'axios';
  2. import jwtDecode from 'jwt-decode';
  3.  
  4. const api = axios.create({
  5.     baseURL: BASE_URL_STRING,
  6. });
  7.  
  8. let isRefreshing = false;
  9. let requestQueue = [];
  10.  
  11. // Add a request interceptor
  12. api.interceptors.request.use(
  13.     async (config) => {
  14.         const accessToken = localStorage.getItem('accessToken');
  15.         const refreshToken = localStorage.getItem('refreshToken');
  16.  
  17.         // console.log("Hello! I am just checking if the interceptor works or not!");
  18.  
  19.         if (config.url !== 'login/refresh/') {
  20.             // Only perform token refresh for requests other than 'login/refresh/'
  21.  
  22.             if (accessToken != undefined && refreshToken != undefined) {
  23.                 // Check if access token is still valid
  24.                 if (accessToken && refreshToken) {
  25.                     if (!isTokenExpired(accessToken)) {
  26.                         config.headers.Authorization = `Bearer ${accessToken}`;
  27.                     } else {
  28.                         if (!isRefreshing) {
  29.                             isRefreshing = true;
  30.                             // Access token expired, make a request to refresh it
  31.                             try {
  32.                                 const response = await api.post('login/refresh/', { 'refresh': refreshToken });
  33.                                 const newAccessToken = response.data.data.access;
  34.                                 const newRefreshToken = response.data.data.refresh;
  35.  
  36.                                 // Update the access and refresh token in localStorage or wherever you are storing it
  37.                                 localStorage.setItem('accessToken', newAccessToken);
  38.                                 localStorage.setItem('refreshToken', newRefreshToken);
  39.                                 // Set the new access token in the request headers
  40.                                 isRefreshing = false;
  41.                                 // config.headers.Authorization = `Bearer ${newAccessToken}`;
  42.  
  43.                                 for(const queueConfig in requestQueue){
  44.                                     queueConfig.headers.Authorization = `Bearer ${newAccessToken}`;
  45.                                     await api.request(queueConfig);
  46.                                 }
  47.                                 requestQueue = [];
  48.  
  49.                                 // return;
  50.  
  51.                             } catch (error) {
  52.                                 isRefreshing = false;
  53.                                 requestQueue = [];
  54.                                 // Handle error refreshing the token (e.g., redirect to login page)
  55.                                 if (error.response && error.response.data && !error.response.data.success) {
  56.                                     // Exception occurred
  57.                                     const { type, code, error: errorMessage } = error.response.data;
  58.                                     // alert(errorMessage);
  59.                                     console.log(error);
  60.                                     console.log(`Error type: ${type}, Error code: ${code}, Error message: ${errorMessage}`);
  61.                                 }
  62.                             }
  63.                         } else {
  64.                             requestQueue.push(config);
  65.                             return new Promise(()=>{})
  66.                         }
  67.                     }
  68.                 }
  69.                 else {
  70.                     // No access token or refresh token, handle this case (e.g., redirect to login page)
  71.                     console.error('No access token or refresh token');
  72.                 }
  73.             }
  74.         }
  75.         return config;
  76.     },
  77.     (error) => {
  78.         return Promise.reject(error);
  79.     }
  80. );
  81.  
  82.  
  83.  
  84. // Function to check if the token is expired
  85. function isTokenExpired(token) {
  86.     try {
  87.         const { exp } = jwtDecode(token);
  88.         const currentTime = Date.now() / 1000; // Convert current time to seconds
  89.         // Check if the token expiration time is in the past
  90.         return currentTime > exp;
  91.     } catch (error) {
  92.         // If there is an error decoding the token, consider it as expired
  93.         return true;
  94.     }
  95. }
  96.  
  97. export default api;
  98.  
Advertisement
Add Comment
Please, Sign In to add comment