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

问题描述

我遇到的问题很奇怪。

我正在使用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));
        }));
    }
  }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)