我有一个AuthenticatedHttpClient类,它扩展了HttpClient,我的所有服务都利用了这个类,因此发出的每个请求都向API提供了一个JWT令牌。
我还有一个通用的错误处理程序,它在令牌过期时处理401响应,并用刷新令牌刷新令牌,然后应该重放原始请求,因此看起来是无缝的(延迟略有增加)。
这一切都可以正常工作,只是重播的请求中包含了创建时设置的原始头,因此头中的JWT令牌现在已经过时。
我能想出两个解决方案。。。
1) 在重试时以某种方式编辑请求,并更改头以使用当前令牌
2) (首选)让请求在发送时而不是在创建时检索令牌。
我现在也不知道怎么做。。。如果有人能告诉我这两个问题的解决方案,我将不胜感激。。。
在我的AuthenticatedHttpClient中使用重试机制的示例:
public get<T>(endPoint: string, options?: IRequestOptions): Observable<T> {
console.log('my http client requesting Get');
return this.http.get<T>(endPoint, options).retryWhen(this.handleErrorAndRetry(this.authService));
}
handleErrorAndRetry定义:
private handleErrorAndRetry(authService: AuthenticationService): (error: any) => any {
return (error: any) => {
return error
.flatMap((err: any) => {
if (err.status === 401) {
return authService.refreshTokenObservable()
}
return Observable.throw({error: 'No retry'});
})
.take(2);
};
}
在服务中使用AuthenticatedHttpClient的示例:
listEntities(companyId: any): Observable<Entity[]> {
return this.http.get<Entity[]>(`${this.apiBase}/${this.apiResource}/${companyId}/${this.apiSubResource}`, {
headers: this.getHeaders()
});
}