Skip to content

Instantly share code, notes, and snippets.

@alexpvieira
Created November 14, 2018 19:48
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alexpvieira/1594023d1740305172ccdf6ee7d49cc3 to your computer and use it in GitHub Desktop.
Save alexpvieira/1594023d1740305172ccdf6ee7d49cc3 to your computer and use it in GitHub Desktop.
Axios Refresh Token
let isRefreshing = false
let subscribers = []
axios.interceptors.response.use(undefined, err => {
const { config, response: { status } } = err
const originalRequest = config
if (status === 401 && store.state.refresh_token) {
if (!isRefreshing) {
isRefreshing = true
let data = {
grant_type: 'refresh_token',
refresh_token: store.state.refresh_token
}
let headers = {
headers: {
'content-type': 'application/x-www-form-urlencoded',
'authorization': "Basic " + btoa(process.env.VUE_APP_CLIENT_ID + ":" + process.env.VUE_APP_CLIENT_SECRET)
}
}
axios.post(process.env.VUE_APP_API_URL_AUTH, qs.stringify(data), headers)
.then(response => {
store.dispatch('SET_ACCESS_TOKEN', [response.data.access_token, response.data.refresh_token])
isRefreshing = false
onRrefreshed(response.data.access_token)
subscribers = []
})
.catch(e => {
store.dispatch('SET_ACCESS_TOKEN', ['', ''])
console.log(e)
})
}
const requestSubscribers = new Promise(resolve => {
subscribeTokenRefresh(token => {
originalRequest.headers = {}
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))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment