【发布时间】:2018-03-27 21:20:26
【问题描述】:
我有一个 AuthService 提供 loggedIn() 函数,如果登录则返回 true,否则返回 false。但是,我使用 JWT 是为了让用户保持登录状态。由于我不仅想检查 JWT 是否过期,还想检查此 Token 是否适合用户,我验证(如果令牌是存储在本地Storage)这个。我如何返回一个简单的真或假?我尝试过这样的事情:
授权服务:
loggedIn(): Observable<boolean> {
const token = this.loadToken();
if (token) {
const headers = this.server.createAuthHeaders(null, null, token);
const httpOptions = {
headers
};
return this.http.get(url, httpOptions)
.map(user => typeof(user) === 'object')
.catch(err => Observable.of(false));
}
return Observable.of(false);
}
和 AuthGuard:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
return this.authService.loggedIn().map((loggedIn) => {
if (!loggedIn) {
this.router.navigate(['/login']);
return false;
} else {
return true;
}
}).take(1);
}
【问题讨论】:
-
CanActivate 守卫可能返回一个 Observable
。这就是你应该返回的。不是布尔值,因为您需要一个异步 http 调用,它返回...一个 Observable。 -
我该怎么做?我用 AuthGuard 更新了问题
-
您可以查看 Observable.of() ,这是一种简单的方法。编辑:我刚刚注意到您的 loggedIn 方法的代码,该代码永远不会起作用,因为 bool 的值将始终为 false。您使用同步方法编写代码,但 http.get 是异步的。
-
谢谢!您能否提供一个代码示例来说明您将如何实现这一点?