Ich muss für jede HTTP-Anfrage ein Token in den 'Authorization'-Header einfügen. Also habe ich einen HttpInterceptor entwickelt und registriert:

@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();
    }
  }));
 }
}

Der Header scheint jedoch niemals auf die gesendete Anfrage gesetzt zu werden. Was mache ich falsch?

Außerdem wird manchmal ein Fehlercode '0' vom Abfangjäger abgefangen. Was heißt das?

Winkel 8.2.11

BEARBEITEN 1: ------------------------

Ich habe es auch so versucht:

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

Es wurde jedoch noch kein Header gesetzt. Außerdem ist das Modul korrekt in app.module registriert

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

BEARBEITEN 2: ------------------------

debugger

Überprüfen Sie dieses Bild ... Ich werde verrückt.

0
Gaetano Piazzolla 21 Feb. 2020 im 17:51

3 Antworten

Beste Antwort

Ich lag falsch. Bei der Aktualisierung der Klonanforderung werden die neuen Header von Angular in Felder mit dem Namen " lazyUpdate " und nicht direkt in die Header eingefügt. Die Anfragen schlugen aus anderen Gründen fehl.

0
Gaetano 23 Feb. 2020 im 08:23

Vielleicht haben Sie vergessen, app.module Folgendes einzugeben:

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

Der letzte Teil schreibt folgendermaßen:

 return next.handle(modifiedReq);
0
Doflamingo19 21 Feb. 2020 im 15:09

Es funktioniert für mich so:

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

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

return next
  .handle(request.clone({
     setHeaders: headersConfig
  }))
0
Louis R 21 Feb. 2020 im 15:02