Axios interceptors inifinite loop при попытке обновить токен - PullRequest
0 голосов
/ 20 января 2019

У меня есть приложение vue.js SPA.Моя цель - обновить токен, если срок его действия истек через перехватчики axios.Когда пользователь отправляет запрос в API, мне нужно сначала проверить время истечения токена, а если он истек - обновите его, а затем выполните запрос пользователя.

Я получил функцию обновления:

const refreshToken = () => {
  return new Promise((resolve, reject) => {
    return axios.post('/api/auth/token/refresh/').then((response) => {
      resolve(response)
    }).catch((error) => {
      reject(error)
    })
  })
}

И перехватчик запроса axios:

axios.interceptors.request.use((config) => {
  let originalRequest = config
  if (jwt.isTokenExpired()) {
    return api.refreshToken()
      .then(res => {
        if (res.data.error == 'TOKEN_BLACKLISTED' && res.headers.authorization) {
          //get the token from headers without "Bearer " word 
          let token = res.headers.authorization.slice(7)
          //save the token in localStorage
          jwt.setToken(`"${token}"`)
          //refresh "Authorization" header with new token
          api.setHeader()
          return Promise.resolve(originalRequest)
        } else {
          jwt.destroyToken()
          jwt.destroyExpiredTime()
          store.dispatch('auth/destroyToken')
          router.push({name: 'login'})
          return Promise.reject()
        }
      })
  }
  return config
}, (err) => {
  return Promise.reject(err)
})

Но теперь он переходит в бесконечный цикл.Как это исправить?

1 Ответ

0 голосов
/ 20 января 2019

Вы делаете запрос в перехватчике.Это означает, что токен все еще истек, когда перехватчик вызывается по запросу к URL-адресу обновления.Поэтому вы можете проверить в перехватчике, установлен ли URL-адрес для URL-адреса обновленного токена, а затем просто разрешить исходный запрос.

...