Skip to content

Instantly share code, notes, and snippets.

@hmtri1011
Last active May 3, 2019 08:48
Show Gist options
  • Save hmtri1011/abf1b458ff5ca8734df9a9c544fb7976 to your computer and use it in GitHub Desktop.
Save hmtri1011/abf1b458ff5ca8734df9a9c544fb7976 to your computer and use it in GitHub Desktop.
Axios refresh token intercept
const refresh = axios.create()
let isRefreshing = false
let requestQueue = []
const processQueue = (error, token = null) => {
requestQueue.forEach(promise => {
if (error) {
promise.reject(error)
} else {
promise.resolve(token)
}
})
requestQueue = []
}
axios.interceptors.response.use(
response => {
return response
},
async error => {
// Do something with response error
const originalRequest = error.config
//console.log("origin", originalRequest._retry);
if (error.response) {
switch (error.response.status) {
case 401:
if (!originalRequest._retry) {
if (isRefreshing) {
return new Promise((resolve, reject) => {
requestQueue.push({ resolve, reject })
})
.then(token => {
axios.defaults.headers.common[
'Authorization'
] = `Bearer ${token}`
originalRequest.headers['Authorization'] = `Bearer ${token}`
return axios(originalRequest)
})
.catch(err => err)
}
originalRequest._retry = true
isRefreshing = true
const refreshToken = await AsyncStorage.getItem(
'userRefreshToken'
)
return new Promise((resolve, reject) => {
refresh
.post(`authen/refresh`, { refreshToken })
.then(async ({ data }) => {
const userToken = data.tokenWrapper.accessToken
await AsyncStorage.setItem('userToken', userToken)
axios.defaults.headers.common['Authorization'] =
`Bearer ${userToken}`
originalRequest.headers['Authorization'] =
`Bearer ${userToken}`
resolve(axios(originalRequest))
processQueue(null, userToken)
})
.catch(err => {
console.log('foacker', err)
config.store.dispatch(
StatusAction.error(
401,
'Session has expired. Please login again!!',
Date.now()
)
)
config.store.dispatch(logOut())
processQueue(err, null)
reject(err)
})
.then(() => {
isRefreshing = false
})
})
}
return Promise.reject(error)
default:
return Promise.reject(error)
}
}
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment