Я пытаюсь поймать 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