我正在尝试编写一个添加授权令牌的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>>
。
有没有办法完成我想要做的事情?
我以前使用getCachedToken
只返回一个字符串。在我们开始使用多个端点之前,这很有效。似乎Adal不会为所有端点缓存令牌。
我正在使用以下Adal package。
答案 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}`}}));
});
}
}