2016-09-07 66 views
2

我需要在发送每个HTTP请求之前检查我的令牌未过期。我试图使注射使用HTTP拦截这样的:Angular 2 - 在每个Http请求之前注入授权令牌

class HttpInterceptor extends Http { 

    constructor(backend: ConnectionBackend, defaultOptions: RequestOptions, private _router: Router) { 
    super(backend, defaultOptions); 
    } 

    get(url: string, options?: RequestOptionsArgs): Observable<Response> { 
    const keycloak$: Observable = KeycloakService.updateToken(); 

    return keycloak$.map((options) => { 
     return super.get(url, this.getRequestOptionArgs(options)); 
    }); 
    // -> Observable<Observable<Response>> 
    } 

    getRequestOptionArgs(options?: RequestOptionsArgs) : RequestOptionsArgs { 
    if (options == null) { 
     options = new RequestOptions(); 
    } 
    if (options.headers == null) { 
     options.headers = new Headers(); 
    } 
    options.headers.append('Content-Type', 'application/json'); 

    return options; 
    } 
} 

我怎样才能实现可观察到的依赖。 KeycloakService.updateToken()返回另一个Observable,所以我需要等待响应,然后添加授权标头。我会很感激任何提示。

+0

如何你的'KeycloakService.updateToken()'返回一个可观察?我从Keycloak网站获得的代码返回一个Promise。你能指点我在哪里可以找到Observable版本的代码?谢谢! – FilmiHero

回答

2

使用switchMap等待观察到的由super.get()返回发射响应之前解决

更换

return keycloak$.map((options) => { 
    return super.get(url, this.getRequestOptionArgs(options)); 
}); 

随着

return keycloak$.switchMap(
    options => super.get(url, this.getRequestOptionArgs(options)) 
); 

Examples

我也会改变:

if (options == null) { 
    options = new RequestOptions(); 
} 
if (options.headers == null) { 
    options.headers = new Headers(); 
} 

有了:

if(!options) options = new RequestOptions(); 
if(!options.headers) options.headers = new Headers(); 

为了赶undefined以及null选项

+0

对我来说同样的方法是行不通的。你能帮我多理解一下吗?我在https://stackoverflow.com/questions/47872897/angular-getting-authorization-token-asynchronously-before-http-calls上发布了一个详细的问题 – gaurang171

相关问题