Не ловится ошибка 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, время: 21:50. |