如何在react-redux中实现刷新令牌

时间:2020-04-17 06:29:22

标签: reactjs async-await react-redux axios refresh-token

我执行的以下代码允许刷新访问令牌,在第一个请求上,响应返回未授权时,运行服务以刷新访问令牌。 代码工作正常,刷新令牌服务在Java后端上运行。 代码不完整,只有对刷新令牌方法的调用。 在下面显示的代码。

const apiMiddleware = ({ dispatch }) => (next) => (action) => {
  const result = next(action);
  if (action.type !== API) {
    return result;
  }
  const {
    url,
    method,
    data,
    onSuccess,
    types,
  } = action.payload;
  const axiosInstance = createAxios();

  const refreshToken = async(originalRequest) => {
    const axiosInstance = createAxios();
    const data = authUtil.getUserLoggedIn();
    const response = await axiosInstance({
      url: `${AUTH_ENDPOINT}/refresh-token`,
      method: 'PUT',
      data: { token: data.refreshToken },
    });
    if (response.status === 200) {
      authUtil.setUserLoggedIn(response.data);
      originalRequest.headers['Authorization'] = response.data.accessToken;
      axiosInstance(originalRequest)
        .then(({ data }) => {
          handlerSuccess({ data });
          return result;
        });
    } else {
      dispatch(apiError(types[1], response.error));
    }
  };
  const handlerSuccess = ({ data }) => {
    dispatch(onSuccess(data));    
  };
  axiosInstance({
    method,
    url,
    data,
  })
    .then(({ data }) => {
      handlerSuccess({ data });
      return result;
    })
    .catch((error) => {
      if (error.response && error.response.status === 403) {
        dispatch(accessDenied(types[2], window.location.pathname));
      } else if (error.response && error.response.status === 401) {
        refreshToken(error.config);
      }
      return result;
    })
};

export default apiMiddleware;

有人可以帮助我改进此代码

0 个答案:

没有答案