【发布时间】:2020-03-15 04:54:25
【问题描述】:
我正在尝试在我的 Angular 前端实现令牌拦截器,但我当前的实现存在一个问题。
我的拦截器如下所示:
intercept(request: HttpRequest<any>,next: HttpHandler): Observable<HttpEvent<any>> {
if (request.headers.get("No-Auth") === "True") {
return next.handle(request);
}
return next.handle(request).pipe(
catchError(error => {
if (error instanceof HttpErrorResponse && error.status === 401) {
this.handle404Error(request, next);
} else {
return throwError(error);
}
})
);
}
及handle404Error函数:
handle404Error(request: HttpRequest<any>, next: HttpHandler) {
if (!this.isRefreshing) {
this.isRefreshing = true;
this.refreshTokenSubject.next(null);
return this.authService.refreshToken().subscribe(
(res: any) => {
if (Boolean(res) === true) {
this.isRefreshing = false;
this.refreshTokenSubject.next(res);
return next.handle(request);
} else {
return this.authService.logout();
}
},
err => {
return this.authService.logout();
},
() => {
this.isRefreshing = false;
}
);
} else {
return this.refreshTokenSubject.pipe(
filter(res => res != null),
take(1),
switchMap(() => {
return next.handle(request);
})
);
}
}
当我进行 API 调用和服务器返回 404 时,我的拦截器将调用 /token 端点以获取新的 JWT。
请注意,我将 JWT 存储在服务器(内存中)的会话对象中,而在客户端我只有 sessionID 和刷新令牌作为 HttpOnly cookie。
问题是,当我进行 API 调用并且 JWT 无效时,它会设置新的 JWT,但它不会再次发送之前的请求。 (JWT过期后我必须按两次按钮才能获取数据)。
你有什么想法,如何实现这个逻辑?
感谢您的帮助。
【问题讨论】:
标签: javascript angular rxjs