我有一个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()
});
}