我在过期时刷新access_token有问题。问题是几乎没有服务向服务器发出请求,我需要解决方案来处理所有这些服务,刷新令牌一次并重复它们。
答案 0 :(得分:3)
你可以实现一个扩展Http的类:
@Injectable()
export class CustomHttp extends Http {
constructor(backend: ConnectionBackend, defaultOptions: RequestOptions) {
super(backend, defaultOptions);
}
request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
console.log('request...');
return super.request(url, options);
}
get(url: string, options?: RequestOptionsArgs): Observable<Response> {
console.log('get...');
return super.get(url, options);
}
}
在引导您的应用程序时注册它:
bootstrap(AppComponent, [HTTP_PROVIDERS, ROUTER_PROVIDERS,
provide(Http, {
useFactory: (backend: XHRBackend, defaultOptions: RequestOptions) => new CustomHttp(backend, defaultOptions),
deps: [XHRBackend, RequestOptions]
})
]);
这样您就可以拦截Angular2中的所有请求。
在此级别,您可以检查令牌到期日期并执行刷新令牌请求。 flatMap运算符将帮助您在此等待执行刷新令牌请求以执行trajet请求。
请将此代码视为示例:
request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
return me.authService
.refreshAuthenticationObservable()
//Use flatMap instead of map
.flatMap((authenticationResult:AuthenticationResult) => {
if (authenticationResult.IsAuthenticated == true) {
// retry with new token
me.authService.setAuthorizationHeader(request.headers);
return super.request(url, request);
}
return Observable.throw(initialError);
});
}
有关详细信息,请参阅此问题:
答案 1 :(得分:0)
Observable.forkJoin(
this.http.get('/app/1').map((res:Response) => res.json()),
this.http.get('/app/2').map((res:Response) => res.json())
).subscribe(
data => {
this.a = data[0]
this.b = data[1]
refreshToken();
},
err => console.error(err)
);