Angular 6 меняет токен JWT перед запросом на переделку после обновления токена - PullRequest
3 голосов
/ 20 мая 2019

Я использую завершение аутентификации JWT, когда срок действия токена истек (сервер проверяет его). Мне нужно вызвать API обновления токена и повторно выполнить последний вызов, который не удался, поскольку токен с истекшим сроком действия.
У меня уже есть Interceptor, но я должен обновить заголовок аутентификации, прежде чем сделать запрос, и мне нужно ждать вызова refreshToken.

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const { shouldRetry } = this;
    return next.handle(request).pipe(  
      retryWhen(genericRetryStrategy({
        shouldRetry
      })),

      catchError(err => {
        //401 the token is invalid so I have to refresh it
        if (err.status === 401) {
          this.auth.refreshToken().subscribe(
            (apiResult: SessionTokenResponse) => {
              this.auth.saveToken(apiResult.token);
            },
            error => this.auth.logout()
          );
          request = request.clone({headers: request.headers.set('Authorization', 'Bearer ' + this.auth.getSessionToken)});
          return next.handle(request);
        }
        const error = err.error.message || err.statusText;
        return throwError(error);
      }),
    )
  }

Это правильный способ переделать вызов? Как я могу дождаться конца refreshToken? Спасибо

РЕДАКТИРОВАТЬ: я обновил с этим кодом, который, кажется, работает, я тестирую его

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const { shouldRetry } = this;
return next.handle(request).pipe(
  retryWhen(genericRetryStrategy({
    shouldRetry
  })),

  catchError(err => {
    //401 the token is invalid so I have to refresh it
    if (err.status === 401) {
      this.auth.refreshToken().subscribe(
        (apiResult: SessionTokenResponse) => {
          this.auth.saveToken(apiResult.token);
          request = request.clone({ headers: request.headers.set('Authorization', 'Bearer ' + apiResult.token) });
          next.handle(request).subscribe();
        },
        err => this.auth.logout()
      );          
    }else{
      const error = err.error.message || err.statusText;
      return throwError(error);
    }
  }),
)

}

1 Ответ

0 голосов
/ 20 мая 2019

Если я правильно понял ваш вопрос, вы можете дождаться обновления токена, используя async, вы можете проверить доступ к текущему токену или обновить его, если он недействителен в CanActivate Кстати, при каждом запросе он будет проверятьДоступ к токену и нет необходимости добавлять дополнительный код в interceptor

в сервис аутентификации

     async isAuthenticated(){
     const response = await this.auth.refreshToken().toPromise();
     return response;
  }

в CanActivate

async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    this.authenticated= await this.Service.isAuthenticated();
    if(this.authenticated) {
         this.auth.saveToken(apiResult.token);
         return true;
      }
    else
        this.auth.logout();
        // navigate to login

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...