问题描述
嗨,我是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工作的身份验证器类
这是我的一些示例代码,尽管您可以使用任何客户端语言来实现此设计模式: