我正在尝试在Angular中实现一个滑动过期会话,在这个会话中,每次与API交互时都应该扩展会话。
HTTP拦截器负责在每次响应后更新令牌。这里的问题是,authService.renewToken()调用从未真正执行对该应用程序接口的请求。我确实在控制台中看到了begin renew token和renewToken日志消息,但是对API的令牌请求从不触发。
你知道问题出在哪里吗?
AuthenticationService
public renewToken(token: string): Observable<Token> {
console.log('renewToken');
return this.api
.createSession(token)
.pipe(tap((newToken) => {
console.log(token === newToken.token);
this.saveToken(newToken);
}));
}@Injectable()
export class ResponseInterceptor implements HttpInterceptor {
private refreshingToken = false;
private tokenSubject = new Subject<any>();
constructor(private injector: Injector) { }
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(req).pipe(tap(event => {
if (this.shouldIntercept(event)) {
this.tokenSubject.next(null);
this.refreshingToken = true;
const authService = this.injector.get(AuthenticationService);
const currentToken = authService.getToken();
console.log('begin renew token');
return authService.renewToken(currentToken).pipe(
switchMap((newToken: Token) => {
console.log("newToken Recieved:", newToken.token);
this.tokenSubject.next(newToken);
return next.handle(req);
}),
finalize(() => { this.refreshingToken = false; })
)
}
return next.handle(req);
}), catchError(errorResponse => {
this.refreshingToken = false;
if (errorResponse.status === 401) {
console.log('Unauthorised response received.');
this.injector.get(Router).navigate(['error']);
}
return throwError(errorResponse);
}));
}发布于 2021-06-28 22:45:44
假设您的saveToken函数返回一个observable,那么您可能看不到任何API响应的原因是tap不订阅this.saveToken。尝试使用switchMap/exhaustMap/concatMap (IMO switchMap最有意义,因为如果有新的请求到达,它将取消正在进行的请求)。这些运算符将自动订阅内部可观测数据。
https://stackoverflow.com/questions/68149896
复制相似问题