reactjs - 如何使用并行响应刷新 Axios 中的身份验证 token ?

标签 reactjs axios jwt refresh-token

我想使用 Axios 在 React 应用程序中实现 JWT 身份验证。 有许多使用 axios.interceptors 的解决方案,如果请求由于身份验证错误而失败,可以再次获取 token 。 示例:

axios.interceptors.response.use(function(response) {
    return response;
},function(error) {
    const originalReq = error.config;
    if ( error.response.status == 401 && 
         !originalReq._retry && 
         error.response.config.url != URL_USER_AUTHENTICATE ) {
        originalReq._retry = true;
        return axios.post(BASE_URL+URL_REFRESH_TOKEN,{})
                    .then((res) =>{
                        if ( res.data.status == "success") {
                            return axios(originalReq);
                        } 
                    }).catch((error) => {window.location.href="/logout/nosession"});
    }
    return Promise.reject(error);
});

但是,如果我们有并行请求,它就不起作用。假设我们有两个并行请求,因此两者都会请求新的身份验证 token 。

有人知道有什么解决办法吗?

最佳答案

我的示例 React SPA 有一些管理此问题的代码,并且可能会为您自己的解决方案提供一些想法。下面的第三个类使用一种处理 promise 列表的技术,但仅对其中一个进行远程调用,然后向所有调用者返回相同的结果。

另一种解决方案是,当 token 即将到期时,根据随访问 token 返回的 expires_in 字段,在后台计时器中进行静默刷新。但这并不完全可靠,因为 401 可能因多种原因而发生,例如由于某些类型的基础设施或服务器 key 更改,因此我总是在客户端中编写 401 处理,以确保可靠性。

关于reactjs - 如何使用并行响应刷新 Axios 中的身份验证 token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71229218/

相关文章:

javascript - 如何使用 Cypress stub 模块功能?

javascript - material-ui 如何更改 TablePagination 中的初始 rowsPerPage

reactjs - Material UI 中的交互式目录

reactjs - axios post请求错误,来自react的422(不可处理的实体)

authentication - JSON Web token (JWT) 的安全性和可靠性问题

javascript - Node :Error 401(Unauthorized) i m using passport-jwt

javascript - 子组件可以访问其包含组件的方法吗?

Laravel - 将多个值传递给 Vue

javascript - React 中的 Axios get 方法响应无法在我的博客应用程序中显示从 firebase 作为数组获取数据

c# - 如何创建使用 RsaSsaPssSha256 签名的 JWT