Angular 17 — HttpInterceptorFn — очередь HTTP-запросов, пока служба обновления токенов не завершена

В проекте Angular 17 с HttpInterceptorFn я столкнулся с проблемой при обновлении токена аутентификации. Действительно, когда приходят два запроса, в то время как у них есть токен с истекшим сроком действия, затем запускаются два запроса на продление. Проблема заключается в том, что второй не удастся, потому что токен обновления был изменен вторым. Итак, у меня есть идея создать линию ожидания, которая будет принимать запросы, поступающие во время текущего обновления токена. Но я не вижу, как тогда управлять исполнением запросов, содержащихся в очереди ожидания. Есть ли у вас идеи, как я мог бы справиться с этим делом? Спасибо !

В проекте Angular 17 с HttpInterceptorFn я хочу поместить HTTP-запросы в очереди ожидания, пока выполняется запрос на обновление токена, а затем выполнить запросы в очереди ожидания.

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
0
204
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны сохранять состояние запроса обновления токена в ожидании, например, используя тему, которая будет выдаваться после завершения обновления, а затем для любого следующего запроса, когда вы поймаете 401 и увидите, что субъект существует (что означает, что обновление ожидает), а затем просто дождитесь его и повторите попытку после завершенный:

let refreshingToken$: Subject<void> | null = null;

export const refreshTokenInterceptor: HttpInterceptorFn = (
  req: HttpRequest<unknown>,
  next: HttpHandlerFn
) => {
  const http = inject(HttpClient);

  return next(req).pipe(
    catchError((err) => {
      if (err.status === 401) {
        if (!refreshingToken$) {
          refreshingToken$ = new Subject<void>();
          http.get('/refresh').subscribe(() => {
            refreshingToken$!.next();
            refreshingToken$!.complete();
            refreshingToken$ = null;
          });
        }
        return refreshingToken$.pipe(switchMap(() => next(req)));
      }

      throw err;
    })
  );
};

Другие вопросы по теме