在刷新令牌后通过调用相同的请求来处理刷新令牌

时间:2019-08-06 20:00:02

标签: reactjs react-native

我正在尝试制作一个通用的拦截器来授权我所有的外发请求。

我的逻辑如下:

我所有的传出请求/ API调用都首先通过拦截器检查我的令牌是否到期,如果响应未经授权,我将进行内部调用以刷新令牌并用新值更新存储密钥。

现在,我需要使用新的令牌值重新调用原始请求,但是我不知道如何检测通过拦截器传递的原始请求。

这是我的代码:

export  const unregister =  fetchIntercept.register({
  request: function (url, config) {
    return [url, config];
  },

  requestError: function (error) {
    return Promise.reject(error);
  },
  responseError: function (error) {
    return Promise.reject(error);
  },

  response: function (response) {
    if (response.status == 401) {
      Services.refreshToken((res)=>{
        if (res.message == 'success') {
          // if token has been refreshed
          // recall the request again
        }else {
          // login again
        }
      })
    }else {
      return response;
    }
  }
})

问题是我不知道如何重新调用通过拦截器传递的相同请求。我对此进行了一些搜索,但找不到执行此方法的方法。

1 个答案:

答案 0 :(得分:0)

fetch-intercept似乎未在响应中提供原始URL,因此,实际上您无法重新触发您的请求。

axios网络库还允许注册响应拦截器,并另外提供有关原始请求url的信息:

axios.interceptors.response.use(undefined, async apiError => {
if (
  apiError.response &&
  apiError.response.status === 401 &&
  apiError.config
) {
  try {
    // refresh access token
    const res = await Services.refreshToken();
    if (res.message === 'success') {
      const { config: oldRequest } = apiError;
      // retrigger old request
      axios.request({...oldRequest, headers: {},});
    } else {
     // go to login page.
    }
  } catch (error) {
    // refresh failed, return to login page
  }
}
相关问题