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);
});
}
}
答案 0 :(得分:3)
我认为您忘记在刷新案例中添加退货:
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.navigate(['/sessiontimeout']);
this.authUserService.requireLoginSubject.next(true);
return Observable.of(false);
}
return Observable.fromPromise(this.oAuthService.refreshToken())
.mergeMap(()=>{
this.authUserService.requireLoginSubject.next(false);
return Observable.of(true);
})
.catch(()=>{
this.router.navigateByUrl('/sessiontimeout');
this.authUserService.requireLoginSubject.next(true);
return Observable.of(false);
});
}
编辑:将承诺转换为Observable,以便更简单地连接运算符。