我们的Redux应用程序使用JWT令牌进行身份验证 . access_token每15分钟到期一次,refresh_token每30天到期一次 . 每次登录并存储在浏览器的本地存储中时,它们都由我们的API提供 . 如果安全 endpoints 收到带有过期令牌的请求,则会返回401 HTTP错误 .

不幸的是,我不知道如何处理刷新过程而不会对用户产生负面影响 . 从技术角度来看,这是我想要实现的目标:

  • 动作创建者使用过期的令牌调用API

  • 客户端收到401 HTTP错误

  • 客户端触发调用API以获取新令牌的函数(通过提供刷新令牌) .

  • 如果调用失败(refresh_token已过期),则提示用户重新输入其凭据以重新获取两个令牌,然后重新尝试原始请求 .

  • 如果呼叫成功,请重新尝试原始请求 .

我想有一个函数来处理刷新过程,并在动作创建器的错误处理部分调用 .

这是我到目前为止所尝试的:

export function handleError(dispatch, current_func, error, handling) {
        if(error.response) {
            if(error.response.status === 401 && readToken("token") !== null) {
                return attemptTokenRefresh(dispatch, current_func)
            }

            if(error.response.status === 422 && readToken("token") === null) {
                return attemptTokenRefresh(dispatch, current_func)
            }
        }

        return(handling())
    }

    export function attemptTokenRefresh(dispatch, on_success) {
        let token = readToken("refresh_token");

        let instance = axios.create({
            headers: {"Authorization": token}
        });

        instance.post("api/refresh").then(response => {
            if (response.data["token"]) {
                storeToken("token", response.data["token"]);
                on_success();
            }
        }).catch(error => {
            //TODO: Allow user to sign back (prevent wiping the state)
        });
    }

dispatch是指Redux提供的调度功能

current_func指动作创建者

错误是指API返回的错误

处理是指其他类型错误的错误处理功能

任何帮助将不胜感激 :)