2016-09-07 8 views
2

Мне нужно проверить, что мой токен не истек, прежде чем отправлять каждый HTTP-запрос. Я пытаюсь сделать инъекцию с помощью Http Interceptor следующим образом:Угловой 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