Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.09.2018, 21:02
Новичок на форуме
Отправить личное сообщение для Виталий529515151 Посмотреть профиль Найти все сообщения от Виталий529515151
 
Регистрация: 09.09.2018
Сообщений: 1

Не ловится ошибка 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()
            }
        })
    }
Ответить с цитированием
  #2 (permalink)  
Старый 10.09.2018, 09:50
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

Виталий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);
            }
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка (spawn ENOENT) при использовании библиотеки ImageMagick на Windows uWeb AJAX и COMET 1 03.10.2014 20:16
При отправке формы Аяксом возникает ошибка Veterinar jQuery 0 19.01.2014 14:39
firebug пишет ошибка invalid range in character class Dim@ Общие вопросы Javascript 5 10.05.2012 16:52
То-ли лыжи не едут, толи... возможно ошибка в коде. AzriMan Общие вопросы Javascript 19 18.05.2009 16:07
IE: неизвестная ошибка выполнения _Kpot_ Internet Explorer 1 03.04.2008 11:00