【发布时间】:2017-11-19 22:58:07
【问题描述】:
AuthGuard 有一个奇怪的问题。
当我单击一个链接时,它会检查用户是否拥有有效的访问令牌。如果没有,它将寻找一个刷新令牌,然后尝试使用它来获取一个访问令牌 (this.oAuthService.refreshToken())。
如果需要刷新,它似乎无法导航。令牌已刷新,但页面无法导航。在令牌刷新发生后,我可以在第二次单击受保护页面的链接后成功导航。
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean>
{
this.authUserService.lastUrl = state.url;
if (this.oAuthService.hasValidAccessToken()) {
this.authUserService.requireLoginSubject.next(false);
return Observable.of(true);
} else {
if (sessionStorage.getItem('refresh_token') === null) {
this.router.navigateByUrl('/sessiontimeout');
this.authUserService.requireLoginSubject.next(true);
return Observable.of(false);
}
this.oAuthService.refreshToken().then(() =>
{
console.log("refreshed token");
this.authUserService.requireLoginSubject.next(false);
return Observable.of(true);
}).catch(() => {
this.router.navigateByUrl('/sessiontimeout');
this.authUserService.requireLoginSubject.next(true);
return Observable.of(false);
});
}
}
【问题讨论】:
-
canActivate也支持承诺。因此,您可以选择返回Promise.resolve(true)。如果你在某个地方确实有一个 observable,你可以轻松地将它转换为 promise。myObservable.toPromise()