Angular Http Interceptor не редактирует заголовки запроса после обновления токена - PullRequest
0 голосов
/ 31 октября 2019

Я использую перехватчик для добавления токенов в мои запросы.

Работает нормально. Но если срок действия токена истек, а запрос возвращает 401, я вызываю мой API, чтобы обновить токен и получить новый, и он тоже работает нормально.

И так в случае успеха, я сбрасываю заголовки иобработайте мой новый запрос с новым токеном авторизации в заголовках, но он просто пуст.

Карта заголовков пуста, и все свойства находятся в свойстве заголовков "lazyUpdate". Итак, мой новый запрос с новым действительным токеном не имеет заголовков запроса и заканчивается ошибкой 401.

private sendRequest(
        request: HttpRequest<any>,
        next: HttpHandler,
        cache: CacheService
    ): Observable<HttpEvent<any>> {
        return next.handle(request)
            .pipe(
                tap((event: HttpEvent<any>) => {
                    if (event instanceof HttpResponse) {
                        if (cache.cachedRoute.find(route => request.url.includes(route))) {
                            cache.put(request, event);
                        }
                    }
                }, (err) => {
                    if (err instanceof HttpErrorResponse) {
                        // access token has expired
                        if (this.currentUser) {
                            if (err.status === 401 && !request.urlWithParams.includes('/login')) {
                                // Store requests into refresh requests cache
                                this.requestsRefreshService.put(request);
                                // Cancel all requests before token has been refreshed
                                this.cancelService.cancelPendingRequests();
                                // forbidden, so refresh_token
                                this.authenticationService.refresh_token(this.currentUser.refresh_token, 'refresh_token')
                                .subscribe(
                                    data => {
                                        this.revoked = false;
                                        for (let requestRefresh of Array.from(this.requestsRefreshService.cacheRefresh.keys())) {
                                            const headers = requestRefresh.headers.set('Authorization', `Bearer ${this.currentUser.access_token}`);
                                            requestRefresh = requestRefresh.clone({ headers });
                                            console.log(requestRefresh);
                                            // This is where it's not working ! Why doesn't my request have any headers when i've been resetting them ?
                                            return next.handle(requestRefresh);
                                        }
                                    },
                                    error => {
                                        // refresh_token has expired
                                        // Remove user & client from local storage
                                        this.authenticationService.deleteCurrentUser();
                                        this.router.navigate([this.localizeService.translateRoute('/connexion')], { queryParams: { token: 'revoked' } });
                                    }
                                );
                            }
                        } else {
                            // No user logged : redirect to login
                            this.authenticationService.deleteCurrentUser();
                            this.router.navigate([this.localizeService.translateRoute('/connexion')], { queryParams: { token: 'revoked' } });
                        }
                    }
                })
            );
    }

Мой запрос должен иметь новые заголовки с правильным токеном аутентификации, но вместо этого больше нетЗаголовки, и я просто не понимаю, чего мне не хватает?

...