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 опции

Другие вопросы по тегам