Не ловится ошибка catchError() | HttpInterceptor
Здравствуйте!
Описание: находимся в AuthInterceptor, angular 6. Он перехватывает ошибку, пробует обновить токен, если получается, то добавляет header и пробует повторить запрос, иначе ДОЛЖЕН logout-ить юзера. Статья, где описан код, почти один в один) Когда срабатывает ошибка при первом запросе, то она ловится и удачно обрабатывается, т.е. пара токенов обновляется. Но когда я в localStorage изменил refresh_token на рандомный текст, то соответственно refresh_token стал не валидным, сервер возвращает 505 ERROR, программа должна попасть в this.authS.refreshTokens().pipe( catchError ...) и logout-ить пользователя. Но ошибка происходит и в блок catchError программа не попадает. Интересно, что код идет по второму кругу. Вот мой дебаг на коленках: zone.js:2969 GET http://localhost:4200/api/user 500 (Internal Server Error) We're in catch block Refresh tokens POST http://localhost:4200/api/token 500 (Internal Server Error) We're in catch block in progress
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(req).pipe(
catchError(error => {
console.log("We're in catch block");
if (this.refreshTokenInProgress) {
console.log("in progress");
return this.refreshTokenSubject.pipe(
filter(value => value != null),
take(1),
switchMap(val => {
console.log("We finally got msg that token was updated");
return next.handle(this.authToken(req));
})
)
} else {
console.log("Refresh tokens");
this.refreshTokenInProgress = true;
this.refreshTokenSubject.next(null);
return this.authS.refreshTokens().pipe(
switchMap(tokens => {
console.log("We got a response!");
this.refreshTokenInProgress = false;
this.refreshTokenSubject.next(tokens);
// save tokens in localStorage
this.authS.saveTokens(tokens.access_token, tokens.refresh_token);
return next.handle(this.authToken(req));
}),
catchError(err => {
this.refreshTokenInProgress = false;
console.log("Refreshing tokens fails");
this.authS.logout();
return throwError(err);
})
)
}
})
);
}
authToken(request) {
const accessToken = this.authS.getAccessToken();
if (!accessToken) {
return request;
}
return request.clone({
setHeaders: {
Authorization: this.authS.getAccessToken()
}
})
}
|
Виталий529515151,
куда пропали эти строки
// We don't want to refresh token for some requests like login or refresh token itself
// So we verify url and we throw an error if it's the case
if (
request.url.includes("refreshtoken") ||
request.url.includes("login")
) {
// We do another check to see if refresh token failed
// In this case we want to logout user and to redirect it to login page
if (request.url.includes("refreshtoken")) {
this.auth.logout();
}
return Observable.throw(error);
}
|
| Часовой пояс GMT +3, время: 17:54. |