prevent looping for refresh token calling
This commit is contained in:
parent
4bb4f8fc17
commit
38960e9132
@ -38,102 +38,64 @@ axiosClient.interceptors.response.use(
|
|||||||
async (error) => {
|
async (error) => {
|
||||||
const originalRequest = error.config;
|
const originalRequest = error.config;
|
||||||
|
|
||||||
if (!originalRequest) {
|
// Prevent infinite loop
|
||||||
|
if (!originalRequest || originalRequest._retry) {
|
||||||
return Promise.reject(error);
|
return Promise.reject(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prevent multiple toasts for the same request
|
// Only show one toast per request
|
||||||
if (!originalRequest._toastShown) {
|
if (!originalRequest._toastShown) {
|
||||||
originalRequest._toastShown = true;
|
originalRequest._toastShown = true;
|
||||||
|
|
||||||
if (error.code === "ERR_CONNECTION_REFUSED") {
|
if (error.code === "ERR_CONNECTION_REFUSED") {
|
||||||
console.error(
|
showToast("Unable to connect to the server. Please try again later.", "error");
|
||||||
"Connection refused. Please ensure the server is running."
|
|
||||||
);
|
|
||||||
|
|
||||||
if (error.config.url.indexOf("refresh-token") != -1) {
|
|
||||||
//showToast("Server is unreachable. Try again later!", "error");
|
|
||||||
} else {
|
|
||||||
showToast(
|
|
||||||
"Unable to connect to the server. Please try again later.",
|
|
||||||
"error"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} else if (error.code === "ERR_NETWORK") {
|
} else if (error.code === "ERR_NETWORK") {
|
||||||
console.error("Network error: Unable to reach the server.");
|
showToast("Network error. Please check your connection.", "error");
|
||||||
if (error.config.url.indexOf("refresh-token") != -1) {
|
|
||||||
//showToast("Server is unreachable. Try again later!", "error");
|
|
||||||
}
|
|
||||||
redirectToLogin();
|
redirectToLogin();
|
||||||
} else if (error.code === "ECONNABORTED") {
|
} else if (error.code === "ECONNABORTED") {
|
||||||
console.error("Request timed out.");
|
showToast("Request timed out. Please try again.", "error");
|
||||||
|
|
||||||
if (error.config.url.indexOf("refresh-token") != -1) {
|
|
||||||
//showToast("Server is unreachable. Try again later!", "error");
|
|
||||||
} else {
|
|
||||||
showToast(
|
|
||||||
"The request took too long. Please try again later.",
|
|
||||||
"error"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} else if (error.response) {
|
} else if (error.response) {
|
||||||
if (error.config.url.indexOf("refresh-token") != -1) {
|
const status = error.response.status;
|
||||||
//showToast("Server is unreachable. Try again later!", "error");
|
const isRefreshRequest = error.config.url.includes("refresh-token");
|
||||||
}
|
|
||||||
// else {
|
if (status === 401 && !isRefreshRequest) {
|
||||||
// // showToast(error.response.data.message, "error"); // repeted toast
|
// Mark as retried to avoid loops
|
||||||
// }
|
|
||||||
if (error.response.status === 401) {
|
|
||||||
originalRequest._retry = true;
|
originalRequest._retry = true;
|
||||||
|
|
||||||
|
const refreshToken = localStorage.getItem("refreshToken");
|
||||||
|
|
||||||
|
if (!refreshToken || error.response.data?.errors === "Invalid or expired refresh token.") {
|
||||||
|
redirectToLogin();
|
||||||
|
return Promise.reject(error);
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Get the refresh token from secure storage
|
// Refresh token
|
||||||
const refreshToken = localStorage.getItem("refreshToken");
|
const res = await axiosClient.post("/api/Auth/refresh-token", {
|
||||||
|
token: localStorage.getItem("jwtToken"),
|
||||||
|
refreshToken,
|
||||||
|
});
|
||||||
|
|
||||||
if (!refreshToken || error.response.data.errors === "Invalid or expired refresh token.") {
|
const { token, refreshToken: newRefreshToken } = res.data.data;
|
||||||
// Redirect to login if refresh token is not available
|
|
||||||
redirectToLogin();
|
|
||||||
return Promise.reject(error);
|
|
||||||
}
|
|
||||||
// Make a request to refresh the access token
|
|
||||||
const response = await axiosClient
|
|
||||||
.post("/api/Auth/refresh-token", {
|
|
||||||
token: localStorage.getItem("jwtToken"),
|
|
||||||
refreshToken,
|
|
||||||
})
|
|
||||||
.catch((error) => {
|
|
||||||
// console.log("7 - error fetching refresh token :", error);
|
|
||||||
});
|
|
||||||
|
|
||||||
const { token, refreshToken: newRefreshToken } = response.data.data;
|
// Save new tokens
|
||||||
localStorage.setItem("jwtToken", token);
|
localStorage.setItem("jwtToken", token);
|
||||||
localStorage.setItem("refreshToken", newRefreshToken);
|
localStorage.setItem("refreshToken", newRefreshToken);
|
||||||
|
|
||||||
// Retry the original request with the new token
|
// Set Authorization header
|
||||||
originalRequest.headers["Authorization"] = `Bearer ${token}`;
|
originalRequest.headers["Authorization"] = `Bearer ${token}`;
|
||||||
|
|
||||||
// Retry the original request
|
// Optional: Instead of retrying, you may choose to reload app or go to home
|
||||||
return axiosClient(originalRequest);
|
return axiosClient(originalRequest); // <== only retry once
|
||||||
} catch (err) {
|
} catch (refreshError) {
|
||||||
// Redirect to login if token refresh fails
|
|
||||||
redirectToLogin();
|
redirectToLogin();
|
||||||
return Promise.reject(err);
|
return Promise.reject(refreshError);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
if (error.config.url.indexOf("refresh-token") != -1) {
|
|
||||||
//showToast("Server is unreachable. Try again later!", "error");
|
|
||||||
// console.log("6 - error fetching refresh token :", error);
|
|
||||||
}
|
|
||||||
// showToast(
|
|
||||||
// error.response.data?.message ||
|
|
||||||
// "An error occurred. Please try again.",
|
|
||||||
// "error"
|
|
||||||
// );
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
console.error("An unknown error occurred:", error.message);
|
showToast("An unknown error occurred.", "error");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Promise.reject(error);
|
return Promise.reject(error);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user