reactjs - Is there any thing missing in updating next js session update with new access token - Stack Overflow

admin2025-04-25  3

let refreshTokenFn = null;

export const setRefreshTokenFunction = (fn) => {
  refreshTokenFn = fn;
};


const API = axios.create({
  baseURL: appConfig.baseUrl,
  headers: {
    "Content-Type": "application/json",
    "platform": "web",
  },
});

let isRefreshing = false;
let failedRequestsQueue = [];
let hasRefreshedOnce = false;

const processQueue = (error, token) => {
  failedRequestsQueue.forEach((request) => {
    if (error) {
      request.reject(error);
    } else {
      request.resolve(token);
    }
  });
  failedRequestsQueue = [];
};

const handleSessionExpired = () => {
  signOut({ callbackUrl: "/buyer/auth/sign-in" });
  return Promise.reject(new Error("Session expired. Please log in again."));
};

const responseInterceptorError = async (error) => {
  const originalRequest = error.config;

  if (error?.response?.status === 401) {
    debugger;
    if (hasRefreshedOnce) {
      return handleSessionExpired();
    }
    const session = await getSession();
    
    if (session?.user?.remember === "false") {
      signOut({ callbackUrl: "/buyer/auth/sign-in" });
      return Promise.reject(new Error("Session expired. Please log in again."));
    }

    if (isRefreshing) {
      return new Promise((resolve, reject) => {
        failedRequestsQueue.push({ resolve, reject });
      })
        .then((token) => {
          originalRequest.headers.Authorization = `Bearer ${token}`;
          return API(originalRequest);
        })
        .catch((err) => Promise.reject(err));
    }

    isRefreshing = true;

    try {
      if (!refreshTokenFn) {
        throw new Error("Refresh token function not set");
      }
      const result = await refreshTokenFn();
      const updatedSession = await getSession();
      const newAccessToken = updatedSession?.user?.access;
      
      if (!newAccessToken) {
        throw new Error("Failed to refresh access token");
      }
      processQueue(null, newAccessToken);
      originalRequest.headers.Authorization = `Bearer ${newAccessToken}`;
      hasRefreshedOnce = true;
      return API(originalRequest);

    } catch (refreshError) {
      processQueue(refreshError, null);
      signOut({ callbackUrl: "/buyer/auth/sign-in" });
      return Promise.reject(refreshError);
    } finally {
      
      isRefreshing = false;
    }
  }

  return Promise.reject(error);
};

API.interceptors.request.use(requestInterceptor, requestInterceptorError);

API.interceptors.response.use((response) => response,responseInterceptorError);

export default API;
转载请注明原文地址:http://anycun.com/QandA/1745532692a90859.html