Skip to content

Instantly share code, notes, and snippets.

@andrealvimc
Created May 27, 2021 18:38
Show Gist options
  • Save andrealvimc/cb6a1db3d91b39188df2ea86dcffe3f8 to your computer and use it in GitHub Desktop.
Save andrealvimc/cb6a1db3d91b39188df2ea86dcffe3f8 to your computer and use it in GitHub Desktop.
Axios config refresh token and request queue
import axios, { AxiosError } from 'axios';
import { parseCookies, setCookie } from 'nookies'
let cookies = parseCookies();
let isRefreshing = false;
let failedRequestQueue = [];
export const api = axios.create({
baseURL: 'http://localhost:3333',
headers: {
Authorization: `Bearer ${cookies['nextauth.token']}`
}
});
api.interceptors.response.use(response => {
return response;
}, (error: AxiosError) => {
if (error.response.status === 401) {
if (error.response.data?.code === 'token.expired') {
cookies = parseCookies();
const { 'nextauth.refreshToken': refreshToken } = cookies;
const originalConfig = error.config;
if (!isRefreshing) {
isRefreshing = true;
api.post('/refresh', {
refreshToken
}).then(response => {
const { token } = response.data;
setCookie(undefined, 'nextauth.token', token, {
maxAge: 60 * 60 * 24 * 30, // 30 days
path: '/'
});
setCookie(undefined, 'nextauth.refreshToken', response.data.refreshToken, {
maxAge: 60 * 60 * 24 * 30, // 30 days
path: '/'
});
api.defaults.headers['Authorization'] = `Bearer ${token}`;
failedRequestQueue.forEach(request => request.onSuccess(token));
failedRequestQueue = [];
}).catch(error => {
failedRequestQueue.forEach(request => request.onFailure(error));
failedRequestQueue = [];
}).finally(() => {
isRefreshing = false;
});
}
return new Promise((resolve, reject) => {
failedRequestQueue.push({
onSuccess: (token: string) => {
originalConfig.headers['Authorization'] = `Bearer ${token}`;
resolve(api(originalConfig));
},
onFailure: (err: AxiosError) => {
reject(err);
}
});
})
} else {
// deslogar o usuário
}
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment