Обновить запрос токена без предъявителя авторизации - PullRequest
0 голосов
/ 28 мая 2019

Я работаю с перехватчиком обновления маркера в приложении Angular 7. У меня есть JWT перехватчик, который добавляет токен авторизации для каждого запроса. Теперь я хочу отправить токен обновления без канала авторизации, поскольку API не требует канала авторизации.

Проблема теперь в том, что запрос токена обновления отправляется с токеном с истекшим сроком действия как носитель авторизации. Но серверу не требуется маркер доступа с истекшим сроком действия в качестве носителя авторизации. Любая помощь будет оценена.

Вот мой метод обновления токена.

  refreshToken() {
    const token = localStorage.getItem('refresh_token');
    return this.http.post(`${environment.apiUrl}/token/refresh`, { 'refresh_token': token }, {headers: {}})
      .pipe(
        map(res => {
          this.tokenPayload = res;
          this.tokenPayload = this.tokenPayload.data.access_token;
          if (res) {
            localStorage.setItem('access_token', JSON.stringify(this.tokenPayload));
          }
          return this.tokenPayload;
        }));
  }

Вот мой JWT-перехватчик.

 isRefreshingToken = false;
  tokenSubject: BehaviorSubject<string> = new BehaviorSubject<string>(null);

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpSentEvent
  | HttpHeaderResponse | HttpProgressEvent | HttpResponse<any> | HttpUserEvent<any> | any> {

    return next.handle(this.addTokenToRequest(request, this.authService.getAuthToken()))
      .pipe(
        catchError(err => {
          if (err instanceof HttpErrorResponse) {
            switch ((<HttpErrorResponse>err).status) {
              case 401:
                return this.handle401Error(request, next);
              case 400:
                return <any>this.authService.logout();
            }
          } else {
            return throwError(err);
          }
        }));
  }

  private addTokenToRequest(request: HttpRequest<any>, token: string): HttpRequest<any> {
    return request.clone({ setHeaders: { Authorization: `Bearer ${token}`}});
  }


  private handle401Error(request: HttpRequest<any>, next: HttpHandler) {

    if(!this.isRefreshingToken) {

      this.isRefreshingToken = true;

      // Reset here so that the following requests wait until the token
      // comes back from the refreshToken call.
      this.tokenSubject.next(null);

      return this.authService.refreshToken()
      .pipe(
       switchMap((token) => {

         if(token) {
           this.tokenSubject.next(JSON.stringify(token));
           localStorage.setItem('access_token', JSON.stringify(token));
           return next.handle(this.addTokenToRequest(request, JSON.stringify(token)));
         }

         return <any>this.authService.logout();
       }),
       catchError(err => {

         return <any>this.authService.logout();
       }),
       finalize(() => {
         this.isRefreshingToken = false;
       })
     );
    } else {
      this.isRefreshingToken = false;

      return this.tokenSubject
        .pipe(filter(token => token != null),
          take(1),
          switchMap(token => {
          return next.handle(this.addTokenToRequest(request, token));
        }));
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...