用于Auth0刷新令牌处理的Angular HttpInterceptor

时间:2018-04-24 07:46:37

标签: angular rxjs httpclient observable angular-http-interceptors

我正在尝试编写HttpInterceptor,它在API访问令牌到期时刷新它。

主要问题是在刷新令牌请求返回之前保留任何HTTP请求。如果令牌已成功刷新,则可以触发给定的请求,如果没有,则应用程序应该自动注销。

简而言之:

  • 我有2个Observables
  • 我想订阅第一个(刷新令牌)
  • 如果成功,我想返回第二个observable(来自方法参数的请求)
  • 如果没有,我想自动注销并抛出一个Observable

这是我目前的代码:

@Injectable()
export class RefreshTokenInterceptor implements HttpInterceptor {

  constructor(private authenticationService: AuthenticationService) { }

  public intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    if (this.isRefreshOfAccessTokenUnnecessary()) {
      return next.handle(request);
    }

    return this.authenticationService.refreshToken()
      .concatMap(() => next.handle(request))
      .filter((item) => item instanceof HttpResponse)
      .catch(() => this.refreshTokenFail());
  }


  private isRefreshOfAccessTokenUnnecessary(): boolean {
    ...
  }

  private refreshTokenFail(): ErrorObservable {
    this.authenticationService.logOut();
    return Observable.throw(new Error('not authorized'));
  }
}

问题在于我在使用适当的Observable运算符时遇到了麻烦。 concatMap似乎有效,但并不完美。令牌刷新没有问题,其他请求正在等待,但这有时会导致重复请求。

有人能指出我来自RxJS的哪个运营商适合吗?说实话,文档并没有多大帮助。

我还没有使用RxJS的lettable运算符。

1 个答案:

答案 0 :(得分:0)

您可以使用async and await

中显示的this plunkr

例如,您将拥有一个argumentClause方法,该方法将返回具有所需结果的承诺(这将是您在执行任何其他操作之前要等待的第一个调用)。

然后,您可以使用其他async方法和async方法调用它。 (如果需要,你可以在await等待它。)

注意:try/catch仅适用于promises,但您可以使用await方法解析一个observable,该方法将承诺返回async