【问题标题】:Using Axios interceptor to stop requests and check for token expiration使用 Axios 拦截器停止请求并检查令牌是否过期
【发布时间】:2019-07-27 21:05:52
【问题描述】:

我正在尝试查看令牌是否过期,如果是,则发送刷新请求,然后才继续执行。

axios.interceptors.request.use(config => {
  let accessToken = getAccessToken()

  if (accessToken && user) {
    config.headers['authorization'] = `Bearer ${accessToken}`
    config.headers['cache-control'] = `no-cache`

    const { exp } = jwtDecode(accessToken)

    if (Date.now() > exp * 1000) {
      refreshAccessToken().then(() => { return config }) // wait for refresh
    } else {
      return config
    }
  }

}, function (error) {
  return Promise.reject(error)
})

这是一个带有承诺的刷新令牌函数:

function refreshAccessToken() {
  return new Promise(async (resolve, reject) => {

    if (refreshing) return resolve('refresh in progress')

    refreshing = true
    let refreshToken = getRefreshToken()

    let response = await serverTokenRefresh(refreshToken)
    if (response.success) {
      setAccessToken(response.accessToken)
      response.email = user
      setLocalStorageUser(response)
      refreshing = false

      return resolve('refresh successful')
    } else {
      await logOut()
      refreshing = false

      return reject(Error('refresh fail: ' + response.message))
    }
  })
}

出于某种原因,Axios 不想等到刷新函数完成并且不向服务器发送任何调用。

我做错了什么?

【问题讨论】:

  • 你在`refreshAccessToken().then(() => { return config }) 中缺少文字return // 等待刷新`

标签: javascript promise xmlhttprequest axios


【解决方案1】:

可能是在您的第一个回调函数中,它需要作为Promise 返回或声明为async

axios.interceptors.request.use(async config => {
  let accessToken = getAccessToken()

  if (accessToken && user) {
    config.headers['authorization'] = `Bearer ${accessToken}`
    config.headers['cache-control'] = `no-cache`

    const { exp } = jwtDecode(accessToken)

    if (Date.now() > exp * 1000) {
      await refreshAccessToken(); // wait for refresh
      return config;
    } else {
      return config
    }
  }

}, function (error) {
  return Promise.reject(error)
})

【讨论】:

  • 嘿,你能告诉我你为什么要这样做exp * 1000吗?
  • @AliHussnain 这是 OP 提出的,所以你必须问他。我在其中的一部分是为 async/await 提供一种正确应用于此问题的方法。话虽如此,我假设exp 以秒为单位,但Date.now 返回一个以毫秒为单位的值。将 exp 乘以 1000 将该值转换为毫秒,以便进行适当的比较。
猜你喜欢
  • 1970-01-01
  • 2020-01-13
  • 2021-01-23
  • 2014-10-17
  • 2022-11-03
  • 1970-01-01
  • 2020-06-17
  • 2020-09-25
  • 1970-01-01
相关资源
最近更新 更多