代码之家  ›  专栏  ›  技术社区  ›  Masoud92m

反应+ReDux+AXIOS+THONK,等待拦截。响应刷新令牌

  •  0
  • Masoud92m  · 技术社区  · 6 年前

    axios interceptors response 对于刷新令牌,我的代码是:

    axios.interceptors.response.use(response => {
        return response;
    }, error => {
        if (error.response && error.response.data.error === 'token_expired') {
            axios.get('/refresh')
                .then(response => {
                    let newToken = response.data.newToken;
                    dispatch(refreshToken(newToken))
                    error.config.headers.Authorization = 'Bearer ' + newToken;
                    console.log(error.config);
                    return axios.request(error.config);
                });
        } else {
            return Promise.reject(error);
        }
    });
    

    axios.interceptors.response 在刷新令牌重新运行之前 undefined

    我能给谁修这个?

    更新

    axios.interceptors.response.use(response => {
        return response;
    }, error => {
        if (error.response && error.response.data.error === 'token_expired') {
            dispatch(getNewToken(newToken => {
                error.config.headers.Authorization = 'Bearer ' + newToken;
                return axios.request(error.config);
            }))
        } else {
            return Promise.reject(error);
        }
    });
    

    而getNewToken是:

    export const getNewToken = (onSuccess) => {
        return dispatch => {
            axios.get('/refresh')
                .then(response => {
                    let newToken = response.data.newToken;
                    dispatch(refreshToken(newToken))
                    onSuccess(newToken);
                });
        }
    }
    

    当我检查browser web developer时,在network中这个工作和请求用新的令牌重复,但我的操作不会再次运行以呈现响应

    更新2:

    我的中间件:

    const jwtTokenRefresh = ({ dispatch, getState }) => (next => (action) => {
        const timeStamp = Math.floor(Date.now() / 1000);
        const expiration = getState().auth.expiration;
        if (expiration && timeStamp > expiration) {
    
            axios.get('/refresh')
                .then(response => {
                    let newToken = response.data.newToken;
                    dispatch(refreshToken(newToken))
                })
                .then(() => {
                    next(action);
                })
        }else {
            return next(action);
        }
    });
    

    和刷新令牌操作:

    export const refreshToken = dispatch => {
        return dispatch => {
            axios.get('/refresh')
                .then(response => {
                    console.log(response);
                    let newToken = response.data.newToken;
                    const rememberMe = localStorage.getItem('token') ? true : false;
                    dispatch(authSuccess(newToken, rememberMe))
                });
        }
    }
    
    0 回复  |  直到 6 年前
        1
  •  1
  •   IfSoGirl    6 年前

    可以将设置新令牌作为回调函数传递给refreshToken()操作,并在refreshToken返回成功结果时调用它:

    dispatch(refreshToken((newToken) => {
        error.config.headers.Authorization = 'Bearer ' + newToken;
        console.log(error.config);
        return axios.request(error.config);
      })
    )
    

    以及 行动就像

    refreshToken(onSuccess, onFailure) {
         axios.post('/refreshTokenUrl')
         .then(responseData => {
             const {token} = responseData;
             onSuccess(token);
         })
    }