在JWT中刷新和访问令牌流

时间:2020-08-05 23:38:12

标签: javascript node.js jwt

我已经开发了一个标准的JWT系统,该系统可以登录并发出访问令牌和刷新令牌。访问令牌会在短时间后过期,并且有一种刷新令牌的途径。

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

1 个答案:

答案 0 :(得分:0)

最后,我找到了一个比检查时间戳更可靠的解决方案。感谢@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