簡體   English   中英

Angular 攔截器:Http 請求未被調用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM