Skip to content

Instantly share code, notes, and snippets.

@kibolho
Last active October 26, 2022 14:41
Show Gist options
  • Select an option

  • Save kibolho/6817e4a6f37ef08147225d7ae769bf56 to your computer and use it in GitHub Desktop.

Select an option

Save kibolho/6817e4a6f37ef08147225d7ae769bf56 to your computer and use it in GitHub Desktop.
Interceptor Axios Refresh Token
Interceptor Axios RefreshToken
let isRefreshing = false;
let failedRequestsQueue: any[] = [];
api.interceptors.response.use(
(response) => {
return response;
},
async (error: AxiosError) => {
const isUnauthorized = error.request && error.response?.status === 401;
const isTheRefreshTokenEndpoint = error.config.url?.includes(BACKEND_ENDPOINTS.REFRESH_TOKEN);
const isToRefresh = isUnauthorized && !isTheRefreshTokenEndpoint;
if (isToRefresh) {
if (error.response?.data?.code === 'token.expired') {
const refreshToken = await Storage.get(
SecureStorageKeys.refreshToken,
);
const originalConfig = error.config;
if (!isRefreshing) {
isRefreshing = true;
api
.post(BACKEND_ENDPOINTS.REFRESH_TOKEN, {
refreshToken,
})
.then(async (response) => {
const { token, refreshToken } = response.data;
await Storage.set(
SecureStorageKeys.refreshToken,
refreshToken,
);
await Storage.set(SecureStorageKeys.token, token);
api.defaults.headers.Authorization = `Bearer ${token}`;
failedRequestsQueue.forEach((request) =>
request.onSuccess(token),
);
failedRequestsQueue = [];
})
.catch((err) => {
failedRequestsQueue.forEach((request) =>
request.onFailure(err),
);
failedRequestsQueue = [];
AuthServices.logout();
})
.finally(() => {
isRefreshing = false;
});
}
return new Promise((resolve, reject) => {
failedRequestsQueue.push({
onSuccess: (token: string) => {
originalConfig.headers.Authorization = `Bearer ${token}`;
resolve(api(originalConfig));
},
onFailure: (err: AxiosError) => {
reject(err);
},
});
});
} else {
return Promise.reject(new AuthenticationError('Não autorizado'));
}
}
return Promise.reject(error);
},
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment