为 Http 拦截器解析课程令牌

Resolve Adal Token for Http Interceptor

我正在尝试编写一个添加授权令牌的 angular (4) 拦截器;

@Injectable()
export class AuthInterceptor implements HttpInterceptor {
  constructor(private _adal: AdalService) {}

  intercept(req: HttpRequest<any>, next: HttpHandler):  Observable<HttpEvent<any>> {
    const resource = this._adal.GetResourceForEndpoint(req.url);

    var token;

    this._adal.acquireToken(resource)
      .subscribe(function (token) {
        token = token;
      });

    const authReq = req.clone({setHeaders: {Authorization: `Bearer ${token}`}});

    return next.handle(authReq);   
  }
}

我马上就知道这是错误的,token 是以异步方式设置的,因此当设置 headers 时,token 是未定义的。

我的问题是,我该如何进行这项工作? acquireToken 来自 return Observable<string> 的 Adal npm 包。拦截器是 Angular 框架的一部分,并期望 Observable<HttpEvent<any>> 被 returned。

有什么方法可以完成我想做的事情吗?

仅供参考

我之前使用的是 getCachedToken,它只是 return 一个字符串。在我们开始使用多个端点之前,这一直很好用。 Adal 似乎没有为所有端点缓存令牌。

我正在使用以下 Adal package

尝试在响应到来后返回 observable:

@Injectable()
export class AuthInterceptor implements HttpInterceptor {
  constructor(private _adal: AdalService) {}
  intercept(req: HttpRequest<any>, next: HttpHandler):  Observable<HttpEvent<any>> {
     return this._adal.acquireToken(this._adal.GetResourceForEndpoint(req.url))
        .switchMap(function (token) {
             return next.handle(req.clone({setHeaders: {Authorization: `Bearer ${token}`}})); 
        });
  }
}