Повторите запрос после получения токена обновления Angular 7 - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь повторить запрос после получения токена обновления.Я трачу 90% вчера, пробуя разные способы, которые сработали для других, но я не нашел ничего, что сработало.У меня 3 перехватчика.первый обрабатывает настройку запроса, второй обрабатывает инъекцию токена, а затем любой действительный ответ, третий обрабатывает любые ошибки.

Я пытался использовать switchMap при вызове refreshToken, но тогда он просто даже не делаетвызов.Таким образом, он выполняет первый вызов, возвращает, что токен истек.Я делаю вызов обновления и устанавливаю новый токен, но он отказывается повторить вызов.Я что-то упустил?

Перехватчик 1:

export class APIInterceptor implements HttpInterceptor {

constructor() { }

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const clonedReq = req.clone({ url: req.url, responseType: 'json' });
    return next.handle(clonedReq);
  }

}

Перехватчик 2:

export class JwtInterceptor extends BaseService implements HttpInterceptor {

  constructor(private injector: Injector, private notificationService: NotificationService) {
    super();
  }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
     const authService = this.injector.get(AuthenticationService);
     const globalService = this.injector.get(GlobalService);
     const authReq = req.clone({
       headers: req.headers.set('Authorization', this.getAuthToken(req, authService))
      .append('Access-Control-Allow-Origin', '*')
    });

    return next.handle(authReq).map((event: any) => {
      globalService.handleLayoutSetup();
      if (event instanceof HttpResponse) {
        const jsonResponse = <ApiResponse>event.body;
        if (jsonResponse.status === 200) {
          const body = this.objectToBlob(jsonResponse.data);
          const headers = event.headers;
          const status = event.status;
          const statusText = event.statusText;
          const url = event.url;
          const response = new HttpResponse({ body, headers, status, statusText, url });
          return response;
        } else
  this.notificationService.htmlNotificationFromErrors(jsonResponse.errors);

    } else
      return event;
  });
}

private getAuthToken(req: HttpRequest<any>, authService: AuthenticationService) {
   const currentUser = authService.getCurrentUser();
   if (currentUser)
     return 'Bearer ' + currentUser.accessToken.token;
   else
     return '';
 }
}

Перехватчик 3:

export class ValidationInterceptor extends BaseService implements HttpInterceptor {

  private authService: AuthenticationService;
  private authClient: AuthClient;

  constructor(private notificationService: NotificationService, private injector: Injector) {
      super();
  }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
      this.authService = this.injector.get(AuthenticationService);
      const globalService = this.injector.get(GlobalService);
      const signalrService = this.injector.get(SignalRService);
      this.authClient = this.injector.get(AuthClient);

      return next.handle(req).do((event: HttpEvent<any>) => {
          if (event instanceof HttpResponse) {
          }
      }, (errResponse: any) => {
          if (errResponse instanceof HttpErrorResponse) {
              if (errResponse.status === 401 && errResponse.headers.has('Token-Expired')) {
                  return this.authClient.getRefreshToken('0d3452a923d7eb05331ae0e41d0d5e3a')
                  .subscribe((res: string) => {
                      this.authService.updateTokenWithRefreshToken(res);
                      req = this.addAuthHeader(req);
                      return next.handle(req);
                  });
              } else if (errResponse.status === 0)
                  this.notificationService.failure('Error', 'Server is offline');
              else {
                    .. handle errors
                 }
        }   
      });
  }

  addAuthHeader(request) {
      const authHeader = this.authService.getToken();

      if (authHeader) {
          return request.clone({
            setHeaders: {
                'Authorization': authHeader
            }
          });
      }
      return request;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...