刷新JWT令牌后,如何重试API调用?

问题描述

嗨,我是JWT auth前端流程的新手,并想知道在发布新令牌时如何重新发送请求。

据我所知,Auth令牌应该是短命的,而Refresh令牌的寿命更长。这会导致一个问题,即由于身份验证令牌过期,请求经常失败,并且必须使用新的身份验证令牌再次发送请求。

维持这种模式的最佳实践是什么?作为POC,我写了一个简短的片段来展示我的想法,但是觉得可能会有更好的方法

const API_FETCH_ATTEMPTS = 2; 
const refreshAPI = 'backend/refresh';

function customFetch(url,options,retryAttempts = API_FETCH_ATTEMPTS){

  if (!retryAttempts){
    return null 
  }
  const authToken = localStorage.getItem('auth-token');
  return fetch(url,{...options,'AuthToken': authToken})
    .then()// successful call
    .catch(err => {
      if (err.status === '401'){
        fetch(refreshAPI)
          .then(newToken => {
            localStorage.setItem('authToken',newToken)
            customFetch(url,retryAttempts - 1);
          });
      }
    });
}

任何想法/协助都将不胜感激。 谢谢!

解决方法

您在正确的轨道上:

  • 期望401s
  • 刷新访问令牌
  • 使用新令牌仅重试一次API调用
  • 如果令牌刷新失败,请重定向用户以再次登录

我更喜欢使用2个类:

  • 服务代理以调用API
  • 执行OAuth工作的身份验证器类

这是我的一些示例代码,尽管您可以使用任何客户端语言来实现此设计模式: