Created
November 10, 2020 10:27
-
-
Save cakmakok/914aedb7ee242815735cb5b83a589ec9 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
export const interceptor = (store) => { | |
axios.interceptors.response.use(response => { | |
console.log(`request to ${response.config.url} OK with ${response.status}`) | |
return Promise.resolve(response) | |
}, (error) => { | |
console.log(`request to ${error.response.config.url} failed with ${error.response.status}`) | |
if (error.response.status == 401) { | |
const failedRequestConfig = error.config | |
// Now, refresh the token and try failed request again. | |
// First check if refresh request got 401? | |
if (error.response.config.url === "api/user/refresh/" ) { | |
console.log("refresh token request got 401. Handle this situation to prevent loop") | |
console.log("clear tokens and logout user") | |
localStorage.clear(); | |
// redirect user to login page. | |
store.dispatch(logout()); | |
console.log(`throw ${error}`) | |
return Promise.reject(error) | |
} else { | |
// if no refresh token is found we cant reclaim the token so, | |
// route user to login page | |
if (!localStorage.getItem("refresh")) { | |
console.log(`no refresh token found,throwing ${error}`) | |
store.dispatch(logout()); | |
return Promise.reject(error) | |
} | |
console.log("an endpoint got 401 so try to refresh token...") | |
axios.post(`api/user/refresh/`, {refresh: localStorage.getItem("refresh")}).then(response => { | |
const {access, refresh} = response.data | |
// this function stores access token to localStorage. | |
setAuthorizationToken(access); | |
localStorage.setItem("access", access); | |
localStorage.setItem("refresh", refresh); | |
failedRequestConfig.headers["Authorization"] = `JWT ${access}`; | |
console.log(`try ${failedRequestConfig.url} with new token again...`); | |
return axios(failedRequestConfig); | |
} | |
) | |
} | |
} else { | |
console.log("throwing error for 40x...") | |
return Promise.reject(error) | |
} | |
}) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment