我试图在每次请求之前获取 RefreshToken,如果它已过期,我需要刷新它。拦截器调用服务的函数,但我从未收到 API 调用。请帮忙
我的拦截器代码
public intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (!this.authService.isAccessTokenExpired()) {
return next.handle(this.addCookiesToRequest(request));
}
if (this.refreshTokenInProgress) {
return this.refreshTokenSubject.pipe(
filter(result => result !== null),
take(1),
switchMap(() => next.handle(this.addCookiesToRequest(request)))
);
} else {
this.refreshTokenInProgress = true;
this.refreshTokenSubject.next(null);
return this.authService.refreshExpiredToken().pipe(
switchMap((token: any) => {
this.refreshTokenInProgress = false;
this.refreshTokenSubject.next(token);
return next.handle(this.addCookiesToRequest(request));
}),
catchError((error: any) => {
this.refreshTokenInProgress = false;
return Observable.throw(error);
})
);
}
}
}
public addCookiesToRequest(request: HttpRequest<any>): HttpRequest<any> {
return request.clone({
withCredentials: true
});
}
authService refreshToken 代码
refreshExpiredToken() {
return this.http.get(`${api_url}/token/refresh`, {
withCredentials: true,
observe: 'response'
}).pipe(
tap((res) => {
if (res.status >= 300 && res.status < 400) {
window.location.href = res.url;
}
}),
catchError((error) => {
if (error.status === 401) {
this.router.navigate(['/login']);
}
return of(error);
})
);
}
我什至尝试在某处添加 .subscribe(),但仍然没有
答案 0 :(得分:1)
所以问题是我没有从拦截器中排除 refreshToken URL,这就是它在无限循环中拦截自身的原因,这就是它从未被实际调用的原因。
答案 1 :(得分:0)
我认为潜在的问题是您想在客户端处理引用令牌状态。
除此之外,在您的代码中,您的第二个 if 语句依赖于 else 语句:当 refreshTokenInProgress 为真时,拦截器返回 refreshTokenSubject,它将发出一些值 only 在 else 语句中。这样
switchMap(() => next.handle(this.addCookiesToRequest(request)))
永远不会被触发。