【发布时间】:2021-03-03 06:42:38
【问题描述】:
我试图在每个请求之前获取 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(),但仍然没有
【问题讨论】:
标签: angular typescript httpclient interceptor