如何解决拦截器刷新令牌但丢失第一个请求
我遇到的问题很奇怪。
我正在使用Angular 9,并使用我在网上找到的资源,可以在下面创建拦截器。
我的问题是拦截器成功刷新了令牌,但丢失了第一个请求。
例如,假设我必须对“ api / users”进行api调用,但是令牌已过期。 发生以下情况:
- 调用“ api / users” |状态码401(令牌已过期)
- 调用“ api /刷新/令牌/” |状态码201(令牌已更新)
所需的行为将是第三步,再次调用“ 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));
}));
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。