我添加了一个路由保护来检查用户是否经过身份验证并可以登录该应用。下面是一个代码片段,显示了如果用户经过身份验证,我将如何处理2个不同的条件:
if (this.adal.user.isAuthenticated) {
return true;
} else {
this.adal.acquireToken(clientId).toPromise().then((data) => {
console.log('Refreshed the token.');
return(true);
}).catch ((error) => {
console.log('No user logged in.');
this.router.navigate(['/login']);
return(false);
});
}
问题是当调用代码的else部分时,即调用acquireToken()时,它返回一个我可以转换为promise的observable。令牌续订后,我将返回true。但是,当发生这种情况时,我会看到一个空白页面,好像"返回true"永远不会被称为。不知道为什么会这样,也许我使用toPromise方法的方式不对。如果有人能给我一些暗示,那将是很好的。
答案 0 :(得分:0)
According to the interface defintion,CanActivate可以返回Observable,Promise或boolean但不是订阅:
interface CanActivate {
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):
Observable<boolean> | Promise<boolean> | boolean
}
您可以像这样更改代码:
if (this.adal.user.isAuthenticated) {
return of(true);
} else {
this.adal.acquireToken(clientId).pipe(map(() => true))
.catch ((error) => {
console.log('No user logged in.');
this.router.navigate(['/login']);
});
}