【问题标题】:Refresh and access token flow in JWTJWT 中的刷新和访问令牌流
【发布时间】:2020-11-26 04:53:23
【问题描述】:

我开发了一个标准的 JWT 系统,可以登录并发出访问令牌和刷新令牌。访问令牌会在短时间内过期,并且有刷新令牌的路由。

我使用axios 发出请求,但我不确定如何处理过期的令牌。例如,如果我使用我的访问令牌向/secret_route 发出请求并且它已过期,我是否需要等待403 然后向/refresh_token 发出请求,然后再次发出原始请求?从编程的角度来看似乎很混乱,并且在网络上非常浪费。有没有一种高效/优雅的方式来做到这一点?

【问题讨论】:

  • 到期日期是 jwt 的一部分,因此您的客户会知道它何时到期并需要刷新。
  • 这不会与时区等混淆吗?
  • @DaraJava exp 处于 unix 时代。只要 JS 运行时(主机)设置正确的时区和时间 - 一切都会好起来的。
  • @DaraJava 这是 UTC 时间戳,时区无关紧要。是的,如果某些事情没有解决,那么退回到刷新并重试 403 错误仍然是一个好主意。

标签: javascript node.js jwt


【解决方案1】:

我最终得到了一个我认为比检查时间戳更可靠的解决方案。谢谢@Bergi,但我担心系统时钟。我使用 axios 拦截器刷新 401 上的令牌

  // Request interceptor for API calls
  axios.interceptors.request.use(
    async config => {
      config.headers = { 
        'Authorization': `Bearer ${localStorage.getItem("accessToken")}`,
        'Accept': 'application/json',
      }
      return config;
    },
    error => {
      Promise.reject(error)
  });

  // Allow automatic updating of access token
  axios.interceptors.response.use(response => response, async (error) => {
    const originalRequest = error.config;
    if (error.response.status === 401 && !originalRequest._retry) {
      originalRequest._retry = true;
      const res = await axios.post('/users/token', { token: localStorage.getItem('refreshToken') });
      setToken(res.data.accessToken);

      return axios.request(originalRequest);
    }
    return Promise.reject(error);
  });

改编自https://thedutchlab.com/blog/using-axios-interceptors-for-refreshing-your-api-token

【讨论】:

    猜你喜欢
    • 2021-08-23
    • 1970-01-01
    • 2021-12-14
    • 2020-10-15
    • 2018-10-16
    • 2020-01-09
    • 2021-09-17
    • 2017-07-18
    • 2019-09-19
    相关资源
    最近更新 更多