Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Exilz/5f0d2cc8f2f9df1c00476d5d16272cb6 to your computer and use it in GitHub Desktop.
Save Exilz/5f0d2cc8f2f9df1c00476d5d16272cb6 to your computer and use it in GitHub Desktop.
Axios interceptors token refresh for few async requests. ES6
import axios from 'axios';
import { settings } from '../settings';
import { authAPI } from '.';
const request = axios.create({
baseURL: settings.api_v1,
});
request.interceptors.request.use(
config => {
const token = authAPI.getAccessToken();
if (token) {
config.headers.Authorization = token;
}
const url = config.url.split('/');
if (url[url.length - 1] === 'login') {
delete config.headers.Authorization;
}
return config;
},
error => Promise.reject(error),
);
let isRefreshing = false;
let subscribers = [];
request.interceptors.response.use(undefined, err => {
const { config, response: { status } } = err;
const originalRequest = config;
if (status === 401) {
if (!isRefreshing) {
isRefreshing = true;
authAPI.refreshToken().then(respaonse => {
const { data } = respaonse;
isRefreshing = false;
onRrefreshed(data.access_token);
authAPI.setAccessToken(data.access_token);
authAPI.setRefreshToken(data.refresh_token);
subscribers = [];
});
}
const requestSubscribers = new Promise(resolve => {
subscribeTokenRefresh(token => {
originalRequest.headers.Authorization = `Bearer ${token}`;
resolve(axios(originalRequest));
});
});
return requestSubscribers;
}
return Promise.reject(err);
});
function subscribeTokenRefresh(cb) {
subscribers.push(cb);
}
function onRrefreshed(token) {
subscribers.map(cb => cb(token));
}
export default request;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment