繁体   English   中英

Axios 拦截器在 React JS 中不起作用

[英]Axios Interceptor is not working in React JS

我在我的 React JS 应用程序中使用以下代码作为拦截器来取回令牌,但不幸的是,它不起作用。 刷新令牌返回新的 idToken 并正确更新本地存储数据。 我正在使用其他一些运行良好的应用程序的相同代码。 一个主要区别是我目前使用的是 React 18 和之前的 16 我努力找出问题所在,但失败了。 你的帮助将是可观的。

axios.interceptors.response.use(
  (response) => {
    return response;
  },
  (error) => {
    if (error.response.status === 401) {
      // console.log(error.response.data.code)
      let usersData = JSON.parse(localStorage.getItem("userData"));
      const refreshToken = usersData.refreshToken;
      return axios
        .post(
          `${api_base_url}/auth/authentication/refresh_token`,
          JSON.stringify({
            refresh_token: refreshToken,
          })
        )
        .then((response) => {
          usersData["accessToken"] = response.data.data.accessToken;
          usersData["idToken"] = response.data.data.idToken;

          setSessionStorage("userData", usersData);

          error.response.config.headers[
            "Authorization"
          ] = `Bearer ${response.data.data.idToken}`;

          return axios(error.response.config);
        })
        .catch((error) => {
          if (error.response.data.code !== "TOKEN_EXPIRED") {
            return;
          }
          localStorage.clear();
          window.location = "/login";
        });
    }
    return Promise.reject(error);
  }
);
function getIRequestProp(severType, isMultipart, isSocial) {
    const serverUrl = severType ? social_api_base_url : api_base_url;
    let userData = JSON.parse(localStorage.getItem('userData'));
    let idToken;
    idToken = userData !== null ? userData['idToken'] : '';
    let content_type;
    if (isSocial) {
        content_type = 'application/x-www-form-urlencoded'
    } else {
        content_type = isMultipart ? 'multipart/form-data' : 'application/json'
    }

    return {
        serverUrl: serverUrl,
        requestHeader: {
            'Content-Type': content_type,
            'Accept-Language': DEFAULT_LANGUAGE,
            Authorization: `Bearer ${idToken}`
        }
    };
}

async function post(url, body, isSocialServer, isMultipart) {
    const {serverUrl, requestHeader} = getIRequestProp(isSocialServer, isMultipart);
    return axios.post(serverUrl + url, body, {
        headers: requestHeader
    });
}

所以,我这样调用 API:

   AxiosServices.post(ApiUrlServices.SOCIALS_UPDATE_LINKS(UserInfo.userId), payload, false)
        .then(response => {})

我发现return axios(error.response.config); 未在 API 请求标头中发送授权令牌并无限尝试请求。 但安慰error.response.config正确显示配置中的令牌集。

添加对 axios 请求的额外修改,我解决了我的问题。

axios.interceptors.request.use(request => {
    // Edit request config
    let usersData = JSON.parse(localStorage.getItem('userData'));
    request.headers['Authorization'] = `${usersData.idToken}`;
    return request;
}, error => {
    return Promise.reject(error);
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM