Token Expiration Renewal

// Response interceptor
instance.interceptors.response.use(
  response => {
    // Hide loading indicator
    Toast.clear()
    return response
  },
  async error => {
    Toast.clear()

    // 1. Get tokenInfo object from vuex, format: { token, refresh_token }
    const tokenInfo = store.state.tokenInfo
    // 2. Check if token has expired
    if (error.response && error.response.status === 401 && tokenInfo.refresh_token) {
      // Token expired
      console.log('Token expired!')

      try {
        // 3.1 TODO: Make request to get a new valid token using refresh_token
        const { data: res } = await exchangeTokenAPI(tokenInfo.refresh_token)

        // 3.2 TODO: Update Token in Store
        store.commit('updateTokenInfo', { token: res.data.token, refresh_token: tokenInfo.refresh_token })

        // 3.3 Retry the original failed request
        // 3.3.1 If we return a new Promise async request in the response interceptor, the result of this request will be treated as the return value of the original request
        return instance(error.config)
      } catch {
        // Both token and refresh_token are invalid

        // 4.1 Clear vuex and localStorage
        store.commit('cleanState')
        // 4.2 Force redirect to login page
        router.replace('/login?pre=' + router.currentRoute.fullPath)
      }
    }
    return Promise.reject(error)
  }
)

评论

暂无评论。

登录后可发表评论。