【发布时间】:2020-08-28 23:35:04
【问题描述】:
我正在尝试使用 Oauth2 身份验证来处理 API 请求。
我有一个authService 具有三个属性(accessToken、refreshToken 和refreshTokenObservable - 稍后将描述)和apiGet() 方法,它使用 Authorization 标头创建 HTTP GET 请求,如下所示:
apiGet(cleanedPath:string) {
return this.config.getConfig().pipe(mergeMap((config: Config) => {
[...] // Cleans parameters and creates a final query string
// Adding access token as header
let headers: object = {headers: new HttpHeaders().set('Authorization', this.accessToken)}
return this.http.get<any>(cleanedPath, headers).pipe(catchError(this.handleApiGetError.bind(this, cleanedPath)));
}));
}
我希望handleApiGetError() 方法调用新的刷新令牌并尝试重复apiGet(),我尝试将多个apiGet() 调用连接到单个可观察对象,如下所示:
private handleApiGetError(cleanedPath:string, error: HttpErrorResponse) {
if (!this.refreshTokenObservable) {
// getAccessByRefreshToken() is simple HTTP post
this.refreshTokenObservable = this.getAccessByRefreshToken();
}
return this.refreshTokenObservable.pipe(mergeMap(()=> {
return this.apiGet(cleanedPath);
}));
}
但是,这不起作用,因为它在每个失败的 apiGet() 中调用新令牌,导致 OAuth 服务返回多个 E401(令牌已被撤销)。
有没有办法将apiGet() Observers 绑定在一起,并且在错误的情况下只调用一次刷新令牌请求并重新调用失败的apiGet() 调用?
【问题讨论】:
标签: angular rxjs observable