将 Auth0 不记名令牌添加到 Angular HttpInterceptor

时间:2021-01-07 23:29:20

标签: angular auth0

我正在编写一个 HttpInterceptor,它将向传出请求添加不记名令牌。调用getAccessTokenSilently方法获取的不记名令牌。方法是 Auth0 服务的一部分,如果未在本地缓存,则向授权方发出 http 调用以获取令牌。

    getAccessTokenSilently(options?: GetTokenSilentlyOptions): Observable<string>;

基本上我的代码必须做到以下几点;

    import { AuthService } from '@auth0/auth0-angular';
    
    @Injectable()
    export class AuthHttpInterceptor implements HttpInterceptor {
      constructor(public auth:AuthService) {}

      intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        const token = this.auth.getAccessTokenSilently();
        return next.handle(req.clone({ setHeaders: { token } }));
      }
    }

要获取令牌,我需要为 getAccessTokenSilently 订阅观察者,但是当令牌可用时,该方法已经退出。

我尝试使用 await 函数,但它不起作用,因为 getAccessTokenSilently 不返回承诺。

如何在等待令牌可用时暂停我的功能?

1 个答案:

答案 0 :(得分:0)

“暂停”Web 应用程序的主线程是,并且永远是一个糟糕的主意。幸运的是,在这种情况下您不必这样做,因为您可以使用 rxjs 来实现您想要做的事情。类似于以下内容应该可以解决问题:

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return this.auth.getAccessTokenSilently()
        .pipe(
            mergeMap((token) => {
                return next.handle(req.clone({ setHeaders: { token } }));
            })
        );
}

如果你打算用 observables 做更多的工作,你绝对应该检查 rxjs 并做一些教程。