2016-09-07 79 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

相關問題