刷新具有多个请求的访问令牌

rak*_*los 5 interceptor axios vuex

我在努力使axios拦截器正常工作。

当我的令牌过期时,我需要它刷新访问令牌并在刷新令牌后重试原始请求。我有这部分工作。

问题是,如果我有并发的api调用,它将仅在令牌首次无效时重试第一个请求。

这是我的拦截器代码:

    export default function execute() {
  let isRefreshing = false

  // Request
  axios.interceptors.request.use(
    config => {
      var token = Storage.getAccessToken() //localStorage.getItem("token");
      if (token) {
        console.log('Bearer ' + token)
        config.headers['Authorization'] = 'Bearer ' + token
      }
      return config
    },
    error => {
      return Promise.reject(error)
    }
  )

  // Response
  axios.interceptors.response.use(
    response => {
      return response
    },
    error => {
      const originalRequest = error.config
      // token expired
      if (error.response.status === 401) {
        console.log('401 Error need to reresh')

        originalRequest._retry = true

        let tokenModel = {
          accessToken: Storage.getAccessToken(),
          client: 'Web',
          refreshToken: Storage.getRefreshToken()
        }
        //Storage.destroyTokens();
        var refreshPath = Actions.REFRESH

        if (!isRefreshing) {
          isRefreshing = true

          return store
            .dispatch(refreshPath, { tokenModel })
            .then(response => {
              isRefreshing = false
              console.log(response)
              return axios(originalRequest)
            })
            .catch(error => {
              isRefreshing = false
              console.log(error)
              // Logout
            })
        } else {
          console.log('XXXXX')
          console.log('SOME PROBLEM HERE') // <------------------
          console.log('XXXXX')
        }
      } else {
        store.commit(Mutations.SET_ERROR, error.response.data.error)
      }
      return Promise.reject(error)
    }
  )
}
Run Code Online (Sandbox Code Playgroud)

我不确定在上面突出显示的else块中需要什么。

编辑:

当我做

return axios(originalRequest)
Run Code Online (Sandbox Code Playgroud)

在else块中,它起作用,但是我对行为不满意。它基本上一次又一次地重试所有请求,直到刷新令牌。我希望令牌刷新后重试一次。任何想法

谢谢

Cle*_*ton 0

我不知道您的令牌的架构是什么(解密后),但最好保留的属性之一是 exp“expiration_date”。这么说,有了过期日期,您就可以知道何时应该刷新令牌。

如果不了解您的架构,就很难提供正确的解决方案。但是假设您正在手动执行所有操作,通常 onIdle/onActive 是我们检查用户会话是否仍然正常的时候,所以此时您可以使用令牌信息来知道是否应该刷新其值。

理解这个过程很重要,因为只有当用户持续活跃且即将过期(比如 2 分钟前)时,令牌才应该刷新。