web-dev-qa-db-fra.com

Essayer de répéter une demande HTTP après une actualisation du jeton avec un intercepteur dans angular 7 7

J'essaie d'automatiser les demandes de jeton de rafraîchissement lors de la réception d'une erreur 401 avec angular 7.

Entre cela, je ne trouve pas beaucoup de documentation sur la manière de le faire avec angular 7 et que je n'ai pas la connaissance préalable de angular ou rxjs je suis devenue une un peu fou

Je pense que c'est presque terminé, mais pour une raison quelconque, le second suivant.handle (Newreq) n'envoie pas la demande (dans Google chrome Network Lebugger seulement demande la première demande)

je gagne la réponse de rafraîchissement et de fabrication de processLoginResponse (RES) correctement

vous pouvez voir ici mon intercepteur

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

let newReq = req.clone();

return next.handle(req).pipe(
  catchError(error => {
    if (error.status == 401) {
      this._authenticationService.refresh().subscribe(
        res => {
          this._authenticationService.processLoginResponse(res);
          newReq.headers.set("Authorization", "Bearer " + this._authenticationService.authResponse.token)
          return next.handle(newReq)
        },
        error => {
          this._authenticationService.logOut();
        });
    }
    throw error;
  })
);
11
user10955671

Vous pouvez faire quelque chose comme ça:

import { HttpErrorResponse } from '@angular/common/http';

return next.handle(req).pipe(
  catchError((err: any) => {
    if (err instanceof HttpErrorResponse && err.status 401) {
     return this._authenticationService.refresh()
       .pipe(tap(
         (success) => {},
         (err) => {
           this._authenticationService.logOut();
           throw error;
         }
       ).mergeMap((res) => {
         this._authenticationService.processLoginResponse(res);
         newReq.headers.set("Authorization", "Bearer " + this._authenticationService.authResponse.token)
         return next.handle(newReq)
       });
    } else {
      return Observable.of({});
    }
  }
));
0
Florian