HTTP Interceptor не выходит из системы, когда ответ API 401 - PullRequest
0 голосов
/ 18 июня 2019

Я реализовал Angular HTTP перехватчик, проблема, с которой я сталкиваюсь, заключается в том, что при аннулировании токена и щелчке по любому компоненту панели навигации моя служба возвращает 401 из шлюза API ... который должен выйти из системы пользователя, однако,Журналы HTTP-статуса выглядят так: {type: 0}, и сеанс остается в localstorage, поэтому пользователь должен удалить его и попытаться снова войти в систему. Можете ли вы поделиться некоторой информацией о том, чего может не хватать в моем подходе и как отловить ошибку 401 изответ служб в моем приложении Angular 5. Вот моя реализация:

import { HttpInterceptor, HttpRequest, HttpHandler } from '@angular/common/http';
import { Subject, Observable } from 'rxjs';
import { Injector, Injectable } from '@angular/core';
import 'rxjs/add/operator/do';
import { Router } from '@angular/router';
import 'rxjs/add/operator/do';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/empty';
import { AuthenticationService } from './authentication.service';

@Injectable()

export class TokenInterceptor implements HttpInterceptor {
refreshTokenInProgress = false;

tokenRefreshedSource = new Subject();
tokenRefreshed$ = this.tokenRefreshedSource.asObservable();

constructor(
private injector: Injector,
private router: Router,
private authService: AuthenticationService
) { }

addAuthHeader(request) {
console.log('add auth header');
const authHeader = this.authService.getAccessToken();
if (authHeader) {
return request.clone({
setHeaders: {
'Authorization': 'Bearer ' + authHeader
}
});
}
return request;
}

refreshToken() {
if (this.refreshTokenInProgress) {
return new Observable(observer => {
this.tokenRefreshed$.subscribe(() => {
observer.next();
observer.complete();
});
});
} else {
return this.authService.refresh()
.do(() => {
console.log('this has been treated');
this.refreshTokenInProgress = false;
this.tokenRefreshedSource.next();
});
// }
}
}
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<any> {
this.authService = this.injector.get(AuthenticationService);


// Handle request
request = this.addAuthHeader(request);

// Handle response
return next.handle(request).do((data) => {

console.log('HANDLE RESPONSE', data);

return this.refreshToken()
.do((token) => {
request = this.addAuthHeader(request);
return next.handle(request);
})
.catch(() => {
this.authService.logout();
console.log('observable', Observable.empty());
return Observable.empty();
});
});
}
}
...