当令牌过期时 next:HttpHandler 处理来自服务器的请求,当它进入refershToken Subscribe 方法时,它会转到我在 next.handle(request) 上面定义的标头,然后再次转到下一个。所以我之前的请求会发送到客户端,并且不会使用刷新令牌进行更新,现在我现有的请求是 /refersh-token。因此,更新令牌后,我需要仔细检查记录按钮或重新加载记录页面。
// add authorization header with jwt token if available
refreshToken是authenticationService类中的API配置
refreshToken() {
return this.http.get<CommonResponse>(`${environment.apiUrl}/refresh-token`);
}
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const currentUser = this.authenticationService.currentUserValue;
if (currentUser?.token &&
!environment.publicURLS.includes(request.url.replace(environment.apiUrl, ""))
&& !this.router.url.includes("https://www.google.com/inputtools/request")) {
request = request.clone({
setHeaders: {
Authorization: `Bearer ${currentUser.token}`,
},
});
}
return next.handle(request).pipe(tap((data: any) => {
if (data.body?.body) {
if (data.body.body.isTokenExpired) {
this.authenticationService.refreshToken().pipe(map((res) => {
return res;
})).subscribe(res => {
if (res?.body && !res?.isError && res?.body?.token) {
const currentUser = this.authenticationService.currentUserValue;
if (currentUser) {
currentUser.token = res.body.token;
localStorage.setItem('currentUser', JSON.stringify(currentUser));
this.authenticationService.currentUserValueSubject.next(currentUser);
const retryRequest = request.clone({
setHeaders: {
Authorization: 'Bearer ' + currentUser.token,
},
});
next.handle(retryRequest);
}
}
}
);
}
if (data.body.body.isTokenInvalid) {
this.authenticationService.logout();
}
}
}
));
}
您的令牌刷新机制似乎遇到了问题。更新令牌后,您需要使用新令牌重试原始请求。在您的代码中,重试部分似乎缺少实际发送重试请求所需的返回语句。
更换:
next.handle(retryRequest);
与:
return next.handle(retryRequest);
这确保了重试的请求确实被发送。这是代码的修改部分:
const retryRequest = request.clone({
setHeaders: {
Authorization: 'Bearer ' + currentUser.token,
},
});
// Return the observable here to trigger the retried request
return next.handle(retryRequest);
通过进行此更改,现在应该使用刷新的令牌发出后续请求。请随意测试并根据需要进行调整。