角度拦截器:未调用 Http 请求

时间:2021-03-03 06:42:38

标签: angular typescript httpclient interceptor

我试图在每次请求之前获取 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(),但仍然没有

2 个答案:

答案 0 :(得分:1)

所以问题是我没有从拦截器中排除 refreshToken URL,这就是它在无限循环中拦截自身的原因,这就是它从未被实际调用的原因。

答案 1 :(得分:0)

我认为潜在的问题是您想在客户端处理引用令牌状态。

除此之外,在您的代码中,您的第二个 if 语句依赖于 else 语句:当 refreshTokenInProgress 为真时,拦截器返回 refreshTokenSubject,它将发出一些值 only 在 else 语句中。这样

 switchMap(() => next.handle(this.addCookiesToRequest(request)))

永远不会被触发。