Angular 2 - вводить токен авторизации перед каждым запросом Http
Мне нужно проверить, что мой токен не истек, прежде чем я отправляю каждый HTTP-запрос. Я пытаюсь сделать инъекцию с использованием Http Interceptor следующим образом:
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
, поэтому мне нужно дождаться ответа и затем добавить заголовок авторизации. Буду благодарен за любые советы.
1 ответ
Решение
Использование switchMap
ждать наблюдаемого, возвращенного super.get()
разрешить до отправки ответа
замещать
return keycloak$.map((options) => {
return super.get(url, this.getRequestOptionArgs(options));
});
С
return keycloak$.switchMap(
options => super.get(url, this.getRequestOptionArgs(options))
);
Я также изменил бы:
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
опции