拦截器刷新令牌但丢失第一个请求

时间:2020-10-14 21:34:38

标签: api angular9 refresh-token intercept

我遇到的问题很奇怪。

我正在使用Angular 9,并使用我在网上找到的资源,可以在下面创建拦截器。


我的问题是拦截器成功刷新了令牌,但丢失了第一个请求。

例如,假设我必须对“ api / users”进行api调用,但是令牌已过期。 发生以下情况:

  1. 调用“ api / users” |状态码401(令牌已过期)
  2. 调用“ api /刷新/令牌/” |状态码201(令牌已更新)

所需的行为将是第三步,再次调用“ api / users”。但是现在什么也没有发生。我想念的是什么?


private isRefreshing = false;
private refreshTokenSubject: BehaviorSubject<any> = new BehaviorSubject<any>(null);

intercept( request: HttpRequest<any>, next: HttpHandler ): Observable<HttpEvent<any>> {
    request = this.addToken(request)

    return next.handle(request).pipe(
      tap(
        event => {
          if (event instanceof HttpResponse) {
            // console.log(event.status);
          }
        },
        error => {
          if (error.status === 401) {
            return this.handle401Error(request, next);
          }
        }
      )
    );
  }

**将访问令牌添加到每个请求

 addToken(request: HttpRequest<any>) {
    return request.clone({
      setHeaders: {
        Authorization: `Bearer ${localStorage.getItem('accessToken')}`
      }
    });
  }

**刷新令牌

  private handle401Error(request: HttpRequest<any>, next: HttpHandler) {
    if (!this.isRefreshing) {
      this.isRefreshing = true;
      this.refreshTokenSubject.next(null);

      return this.authService.refreshToken().subscribe(token => {
        this.isRefreshing = false;
        this.refreshTokenSubject.next(token.access);
        localStorage.setItem('accessToken', token.access)
        return next.handle(this.addToken(request));
      });

    } else {
      return this.refreshTokenSubject.pipe(
        filter(token => token != null),
        take(1),
        switchMap(jwt => {
          return next.handle(this.addToken(request));
        }));
    }
  }

0 个答案:

没有答案