Skip to content

Instantly share code, notes, and snippets.

@amorino
Forked from Godofbrowser/axios.refresh_token.1.js
Created March 14, 2019 17:01
Show Gist options
  • Save amorino/7a86f4736eac10fb3858020298675940 to your computer and use it in GitHub Desktop.
Save amorino/7a86f4736eac10fb3858020298675940 to your computer and use it in GitHub Desktop.

Revisions

  1. @Godofbrowser Godofbrowser revised this gist Jul 26, 2018. No changes.
  2. @Godofbrowser Godofbrowser revised this gist Jul 26, 2018. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions axios.refresh_token.js
    Original file line number Diff line number Diff line change
    @@ -44,11 +44,11 @@ axios.interceptors.response.use(function (response) {
    window.localStorage.setItem('refreshToken', data.refreshToken);
    axios.defaults.headers.common['Authorization'] = 'Bearer ' + data.token;
    originalRequest.headers['Authorization'] = 'Bearer ' + data.token;
    processQueue(data.token);
    processQueue(null, data.token);
    resolve(axios(originalRequest));
    })
    .catch((err) => {
    processQueue(null);
    processQueue(err, null);
    reject(err);
    })
    .then(() => { isRefreshing = false })
  3. @Godofbrowser Godofbrowser revised this gist Jul 26, 2018. No changes.
  4. @Godofbrowser Godofbrowser revised this gist Jul 26, 2018. 1 changed file with 13 additions and 13 deletions.
    26 changes: 13 additions & 13 deletions axios.refresh_token.js
    Original file line number Diff line number Diff line change
    @@ -20,7 +20,18 @@ axios.interceptors.response.use(function (response) {

    const originalRequest = error.config;

    if (error.response.status === 401 && !originalRequest._retry && !isRefreshing) {
    if (error.response.status === 401 && !originalRequest._retry) {

    if (isRefreshing) {
    return new Promise(function(resolve, reject) {
    failedQueue.push({resolve, reject})
    }).then(token => {
    originalRequest.headers['Authorization'] = 'Bearer ' + token;
    return axios(originalRequest);
    }).catch(err => {
    return err
    })
    }

    originalRequest._retry = true;
    isRefreshing = true;
    @@ -37,23 +48,12 @@ axios.interceptors.response.use(function (response) {
    resolve(axios(originalRequest));
    })
    .catch((err) => {
    reject(err)
    processQueue(null);
    reject(err);
    })
    .then(() => { isRefreshing = false })
    })
    }

    if (error.response.status === 401 && isRefreshing) {
    return new Promise(function(resolve, reject) {
    failedQueue.push({resolve, reject})
    }).then(token => {
    originalRequest.headers['Authorization'] = 'Bearer ' + token;
    return axios(originalRequest);
    }).catch(err => {
    return err
    })
    }

    return Promise.reject(error);
    });
  5. @Godofbrowser Godofbrowser revised this gist Jul 26, 2018. 1 changed file with 45 additions and 9 deletions.
    54 changes: 45 additions & 9 deletions axios.refresh_token.js
    Original file line number Diff line number Diff line change
    @@ -1,22 +1,58 @@
    // for multiple requests
    let isRefreshing = false;
    let failedQueue = [];

    const processQueue = (error, token = null) => {
    failedQueue.forEach(prom => {
    if (error) {
    prom.reject(error);
    } else {
    prom.resolve(token);
    }
    })

    failedQueue = [];
    }

    axios.interceptors.response.use(function (response) {
    return response;
    }, function (error) {

    const originalRequest = error.config;

    if (error.response.status === 401 && !originalRequest._retry) {
    if (error.response.status === 401 && !originalRequest._retry && !isRefreshing) {

    originalRequest._retry = true;
    isRefreshing = true;

    const refreshToken = window.localStorage.getItem('refreshToken');
    return axios.post('http://localhost:8000/auth/refresh', { refreshToken })
    .then(({data}) => {
    window.localStorage.setItem('token', data.token);
    window.localStorage.setItem('refreshToken', data.refreshToken);
    axios.defaults.headers.common['Authorization'] = 'Bearer ' + data.token;
    originalRequest.headers['Authorization'] = 'Bearer ' + data.token;
    return axios(originalRequest);
    });
    return new Promise(function (resolve, reject) {
    axios.post('http://localhost:8000/auth/refresh', { refreshToken })
    .then(({data}) => {
    window.localStorage.setItem('token', data.token);
    window.localStorage.setItem('refreshToken', data.refreshToken);
    axios.defaults.headers.common['Authorization'] = 'Bearer ' + data.token;
    originalRequest.headers['Authorization'] = 'Bearer ' + data.token;
    processQueue(data.token);
    resolve(axios(originalRequest));
    })
    .catch((err) => {
    reject(err)
    processQueue(null);
    })
    .then(() => { isRefreshing = false })
    })
    }

    if (error.response.status === 401 && isRefreshing) {
    return new Promise(function(resolve, reject) {
    failedQueue.push({resolve, reject})
    }).then(token => {
    originalRequest.headers['Authorization'] = 'Bearer ' + token;
    return axios(originalRequest);
    }).catch(err => {
    return err
    })
    }

    return Promise.reject(error);
  6. @culttm culttm created this gist Oct 5, 2017.
    23 changes: 23 additions & 0 deletions axios.refresh_token.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,23 @@
    axios.interceptors.response.use(function (response) {
    return response;
    }, function (error) {

    const originalRequest = error.config;

    if (error.response.status === 401 && !originalRequest._retry) {

    originalRequest._retry = true;

    const refreshToken = window.localStorage.getItem('refreshToken');
    return axios.post('http://localhost:8000/auth/refresh', { refreshToken })
    .then(({data}) => {
    window.localStorage.setItem('token', data.token);
    window.localStorage.setItem('refreshToken', data.refreshToken);
    axios.defaults.headers.common['Authorization'] = 'Bearer ' + data.token;
    originalRequest.headers['Authorization'] = 'Bearer ' + data.token;
    return axios(originalRequest);
    });
    }

    return Promise.reject(error);
    });