Подписаться бесконечный цикл - PullRequest
1 голос
/ 18 сентября 2019

Я пытаюсь поймать BadRequest (400) при обновлении токена JWT в auth.interceptor.ts, потому что токен обновления должен истечь в какой-то момент.Вы можете проверить фрагмент кода ниже, но я также предоставлю StackBlitz.

Проблема возникает из catchError, когда я в ней return this.authService.logout().Он запускается в бесконечный цикл, потому что, когда я делаю return next.handle(request); в switchMap, он продолжает /api/values (фактический запрос), для которого пользователь не авторизован, и выдает еще одну ошибку.То же самое касается, когда я делаю return throwError(error);.Вот где происходит бесконечный цикл.Я действительно должен подписаться на this.authService.logout(), потому что после того, как я выхожу из системы, я аннулирую его токен обновления из моей базы данных (сообщение HTTP).Вы можете увидеть весь код на StackBlitz.

return this.authService.refreshToken()
    .pipe(
      switchMap(token => {
        console.log('Token refreshed.');
        return next.handle(this.attachTokenToRequest(request, token));
      }),
      catchError(error => {
        return this.authService.logout()
          .pipe(
            switchMap(result => {
              console.log(result);
              return throwError(error); // request = /api/values, error = /api/refresh/token
              // return next.handle(request);
            })
          )
      })
    );

За исключением вышеперечисленного, я пытался перехватить код ошибки 400 с помощью приведенного ниже кода, но он вроде тот же.

if (error.status === 400 && error.error === "Cannot find that refresh token." || error.error === "Expired refresh token.") {
  console.log('400 bad request');
  return this.authService.logout()
    .pipe(
      switchMap(error => {
        return Observable.throw(error); // this should be replaced, maybe?
      })
    );
}

Я знаюв чем проблема, как я объяснил выше.Чего я не знаю, так это как решить.Я хочу поймать, когда срок действия маркера обновления истекает или его просто больше не существует, а затем выйти из системы и перейти на страницу входа.Как я могу это сделать?

https://stackblitz.com/edit/angular-dziwbx

1 Ответ

3 голосов
/ 18 сентября 2019

Вам необходимо сделать запрос logout к обходным перехватчикам внутреннего сервера.Таким образом, вы создаете новый HttpClient, используя HttpBackend, и используете его, когда вы не хотите, чтобы ваши перехватчики мешали выполнению запроса.

@Injectable()
export class AuthService {
   private backendClient: HttpClient;

   public constructor(private httpClient: HttpClient, handler: HttpBackend) {
      this.backendClient = new HttpClient(handler);
   }

   // this API uses interceptors
   public refreshToken() {
      return this.httpClient.get(....);
   }

   // this API does not use interceptors
   public logout() {
      return this.backendClient.get(....);
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...