我应该如何在Redux应用程序中处理JWT令牌刷新?

时间:2017-06-30 19:30:19

标签: javascript redux token jwt

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

处理是指其他类型错误的错误处理函数

非常感谢任何帮助:)

0 个答案:

没有答案