解析Http拦截器的Adal令牌

时间:2017-10-20 13:01:08

标签: angular rxjs observable adal.js

我正在尝试编写一个添加授权令牌的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是以异步方式设置的,因此在设置标头时,token未定义。

我的问题是,我如何使这项工作? acquireToken来自Adal npm包,返回Observable<string>。拦截器是Angular框架的一部分,期望返回Observable<HttpEvent<any>>

有没有办法完成我想要做的事情?

FYI

我以前使用getCachedToken只返回一个字符串。在我们开始使用多个端点之前,这很有效。似乎Adal不会为所有端点缓存令牌。

我正在使用以下Adal package

1 个答案:

答案 0 :(得分:1)

尝试在响应来之后返回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}`}})); 
        });
  }
}