I have an react app that uses an express api . I am trying to refresh token when access token is expired. I am using axios interceptor for this achievement .
let isRefreshing = false;
let failedQueue = [];
const processQueue = (error, accessToken = null) => {
failedQueue.forEach((prom) => {
if (error) {
prom.reject(error);
} else {
prom.resolve(accessToken);
}
});
failedQueue = [];
};
axiosInstance.interceptors.response.use(
async (response) => {
return response;
},
async (error) => {
const { status, data } = error.response;
const originalRequest = error.config;
if (error.response.status===401 && data.message === "Invalid refresh token") {
console.log("unauthorized");
store.dispatch(authActions.logout());
return;
}
if(error.response.status === 401 && data.message === "You are not authorized to access this route,you don't have a valid refresh token to create new access token "){
console.log("invalid refresh token");
console.log(error.response)
store.dispatch(authActions.logout());
return error.response;
}
if (error.response.status === 401 && !originalRequest._retry) {
if (isRefreshing) {
console.log("isRefreshing");
return new Promise((resolve, reject) => {
console.log("isRefreshing2");
failedQueue.push({ resolve, reject });
})
.then((accessToken) => {
console.log("access")
originalRequest.headers["Authorization"] =
"Bearer:" + accessToken;
console.log("access: " + accessToken);
return axiosInstance(originalRequest);
})
.catch((err) => {
console.log("err");
return Promise.reject(err);
});
}
console.log("no refreshing");
originalRequest._retry = true;
console.log(originalRequest._retry);
isRefreshing = true;
return new Promise((resolve, reject) => {
postMethod("auth/token",null,null).then((result) => {
console.log("result:",result)
setToken(result.data.access_token);
axiosInstance.defaults.headers.common["Authorization"] =
"Bearer:" + result.data.access_token;
originalRequest.headers["Authorization"] =
"Bearer:" + result.data.access_token;
processQueue(null, result.data.access_token);
resolve(axiosInstance(originalRequest));
})
.catch((err) => {
console.log(err.response)
processQueue(err, null);
reject(err);
})
.then(() => {
isRefreshing = false;
});
//TODO:Eğer refresh tokenın da süresi dolmuşsa burda history.push oluyor. ama diğer tarafı bozuyor
});
}
return Promise.reject(error);
}
);
It stuck somewhere. I used console.log to debug it . From console;
POST http://localhost:5000/api/auth/token?null 401 (Unauthorized)
no refreshing // it is first line after from third if statement
POST http://localhost:5000/api/auth/token?null 401 (Unauthorized)
isRefreshing // it comes from third if statement
isRefreshing2 // it comes from third if statement
After that nothing happen. What should I do ? Thanks for any help