我遇到的问题很奇怪。
我正在使用Angular 9,并使用我在网上找到的资源,可以在下面创建拦截器。
我的问题是拦截器成功刷新了令牌,但丢失了第一个请求。
例如,假设我必须对“ api / users”进行api调用,但是令牌已过期。 发生以下情况:
所需的行为将是第三步,再次调用“ api / users”。但是现在什么也没有发生。我想念的是什么?
private isRefreshing = false;
private refreshTokenSubject: BehaviorSubject<any> = new BehaviorSubject<any>(null);
intercept( request: HttpRequest<any>, next: HttpHandler ): Observable<HttpEvent<any>> {
request = this.addToken(request)
return next.handle(request).pipe(
tap(
event => {
if (event instanceof HttpResponse) {
// console.log(event.status);
}
},
error => {
if (error.status === 401) {
return this.handle401Error(request, next);
}
}
)
);
}
**将访问令牌添加到每个请求
addToken(request: HttpRequest<any>) {
return request.clone({
setHeaders: {
Authorization: `Bearer ${localStorage.getItem('accessToken')}`
}
});
}
**刷新令牌
private handle401Error(request: HttpRequest<any>, next: HttpHandler) {
if (!this.isRefreshing) {
this.isRefreshing = true;
this.refreshTokenSubject.next(null);
return this.authService.refreshToken().subscribe(token => {
this.isRefreshing = false;
this.refreshTokenSubject.next(token.access);
localStorage.setItem('accessToken', token.access)
return next.handle(this.addToken(request));
});
} else {
return this.refreshTokenSubject.pipe(
filter(token => token != null),
take(1),
switchMap(jwt => {
return next.handle(this.addToken(request));
}));
}
}