Угловой HTTP-перехватчик для заголовка аутентификации

Я должен помещать токен в заголовок «Авторизация» для каждого HTTP-запроса. Итак, я разработал и зарегистрировал HttpInterceptor:

@Injectable()
export class TokenInterceptor implements HttpInterceptor {

  constructor(public authService: AuthService) {
  }  

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    let modifiedReq;
    const token = this.authService.getToken();

    // we need the heck clone because the HttpRequest is immutable
    // https://angular.io/guide/http#immutability
    if (token) {
      modifiedReq = request.clone();
      modifiedReq.headers.set('Authorization', `Bearer ${token}`);
    }

    return next.handle(modifiedReq ? modifiedReq : request).pipe(tap(() => {
        // do nothing
    },
    (err: any) => {
    if (err instanceof HttpErrorResponse) {
      if (err.status === 0) {
        alert('what the heck, 0 HTTP code?');
      }
      if (err.status !== 401) {
        return;
      }
      this.authService.goToLogin();
    }
  }));
 }
}

Но кажется, что заголовок никогда не помещается в отправленный запрос. Что я делаю неправильно?

Кроме того, иногда перехватчик перехватывает код ошибки «0»; что это означает?

Угловой 8.2.11

ИЗМЕНИТЬ 1: ------------------------

Я тоже пробовал вот так:

request = request.clone({
            setHeaders: {
                authorization: `Bearer ${token}`
            }
        }); 

но заголовок все еще не установлен. Также модуль правильно прописан в app.module

 providers: [{
   provide: HTTP_INTERCEPTORS,
   useClass: TokenInterceptor ,
   multi: true,
 }..

РЕДАКТИРОВАТЬ 2: ------------------------

отладчик

Посмотри на это изображение ... Я схожу с ума.


person Gaetano Piazzolla    schedule 21.02.2020    source источник


Ответы (3)


У меня это работает так:

const headersConfig = {
  'Accept': 'application/json', //default headers
};
...

if (token) {
  headersConfig['Authorization'] = `Bearer ${token}`;
}
...

return next
  .handle(request.clone({
     setHeaders: headersConfig
  }))
person lovis91    schedule 21.02.2020
comment
Вам не нужно модифицировать запрос, если вам нравится, как я покажу - person lovis91; 21.02.2020

возможно, вы забыли вставить app.module это:

  providers: [{
    provide: HTTP_INTERCEPTORS,
    useClass: TokenInterceptor ,
    multi: true,
  }..

заключительную часть напишите так:

 return next.handle(modifiedReq);
person Doflamingo19    schedule 21.02.2020
comment
нет, он был правильно зарегистрирован. код передается этому перехватчику, но заголовок не установлен. - person Gaetano Piazzolla; 21.02.2020
comment
@gaetatno, если вы делаете console.log (токен), он печатает значение, либо оно пустое, либо ноль ?? - person Doflamingo19; 21.02.2020
comment
он печатает материал - person Gaetano Piazzolla; 21.02.2020
comment
в request.headers, похоже, не установлено значение, как я пытаюсь - person Gaetano Piazzolla; 21.02.2020
comment
Я думаю, проблема в том, что вы делаете if (токен), потому что, если токен равен нулю или пуст, правильно, что у вас нет значения в заголовке, но если токен не равен нулю, это странно - person Doflamingo19; 21.02.2020
comment
@Gaetano я изменяю - person Doflamingo19; 21.02.2020
comment
Извините, ничего не изменилось. - person Gaetano Piazzolla; 21.02.2020
comment
mi dispiace cavolo! - person Doflamingo19; 21.02.2020
comment
aspetta un'attimo ma io nella tua console (che hai mesos nell'immagine) leggo un altro codice - person Doflamingo19; 21.02.2020
comment
Ho Provato a mattere il codice che mi ha consigliato LuisR, ma anche con il tuo non va ... - person Gaetano Piazzolla; 21.02.2020

Я ошибался. При обновлении запроса клонирования angular помещает новые заголовки в поля под названием «lazyUpdate», а не непосредственно внутри заголовков. Запросы не выполнялись по другим причинам.

person Gaetano Piazzolla    schedule 23.02.2020