【发布时间】:2019-11-06 14:40:51
【问题描述】:
我已经实现了 Angular HTTP 拦截器,我面临的问题是当使令牌无效并单击导航栏的任何组件时,我的服务从 API 网关返回 401 ......这应该注销用户,但是, HTTP 状态日志类似于:{ type: 0 },并且会话保留在本地存储中,因此用户必须删除它并尝试再次登录,您能否分享一些见解,我的方法可能缺少什么以及如何捕获错误 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();
});
});
}
}
【问题讨论】:
标签: angular angular-http-interceptors