[英]Angular Interceptor: Http request is not being called
我試圖在每個請求之前獲取 RefreshToken,如果它已過期,我需要刷新它。 攔截器調用服務的 function 但我從未收到 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);
})
);
}
我什至嘗試添加somewhere.subscribe(),但仍然沒有
所以問題是我沒有從攔截器中排除 refreshToken URL ,這就是它在無限循環中攔截自身的原因,這就是它從未被實際調用的原因。
我認為根本問題是您要處理引用令牌 state 客戶端。
除此之外,在您的代碼中,您的第二個 if 語句依賴於 else 語句:當refreshTokenInProgress為 true 時,攔截器返回refreshTokenSubject ,它只會在 else 語句中發出一些值。 這樣
switchMap(() => next.handle(this.addCookiesToRequest(request)))
永遠不會被觸發。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.