使用刷新令牌获取新的访问令牌反应和节点 js

using refresh token to get new access token react and node js

我已经构建了一个 JWT API 用于用户身份验证。我想将它与反应一起使用。 我的应用程序有这些路线:

节点 js API 路由:

React 客户端路由:

当我登录到我的网站时,我可以在访问令牌到期前的 20 秒内看到用户路由中的数据。当访问令牌过期并且我发出新请求时,服务器将使用 401 未经授权的代码进行响应。所以这样我可以确保访问令牌已过期并且我需要使用刷新令牌。我是这样做的:

const API_URL = "http://localhost:8080/api/test/";

const getUserBoard = () => {
  return axios.get(API_URL + "user", { headers: authHeader() })
            .catch((error) => {
              if(error.response.status === 401) {
                // if error response status was 401 then request a new token
                authService.refreshToken();
                window.location.reload();
              }else if(error.response.status === 403) {
                authService.logout();
                window.location.href = "/login";
              }
            });
};

使用刷新令牌获取新访问令牌的代码:

const refreshToken = () => {
  axios({
    url: API_URL + "refreshtoken",
    method: "POST",
    withCredentials: true
  })
    .then((response) => {
      if(response.data.accessToken) {
        const user = JSON.parse(localStorage.getItem("user"));
        user.accessToken = response.data.accessToken;
        localStorage.setItem("user", JSON.stringify(user));
      }
    })
    .catch((error) => {
      console.log("server: " + JSON.stringify(error.response));
    })
}

用于设置 header 以使用访问令牌从服务器接收数据的代码:

export default function authHeader() {
    const user = JSON.parse(localStorage.getItem('user'));
  
    if (user && user.accessToken) {
      // for Node.js Express back-end
      return { 'x-access-token': user.accessToken };
    } else {
      return {};
    }
}  

在出现 401 错误时获取新访问令牌的第一部分工作正常,但我的刷新令牌也在 40 秒后过期。 如果我发送过期的刷新令牌,它不会 return 一个新的访问令牌。因此,我将再次收到 401 错误,这将再次导致 403 错误,在这里我将陷入无限重新加载循环。

有什么想法吗?我如何控制令牌到期?

您正在 node.js 应用程序中发行令牌,对吧?所以这就是您应该调整令牌的到期时间的地方。发行代币的代码应该有设置过期时间的选项。

请记住,刷新令牌过期后您应该重新登录。您可以实现称为滚动刷新令牌的东西。因此,每当您调用 /api/auth/refreshtoken 端点时,您还可以发出一个新的刷新令牌,具有新的到期时间并 return 它在 cookie 中。