Angular Guard 和 JWT

Angular Guard and JWT

我正在尝试执行下一步...我有一个 API,我通过 POST 发送 JWT 令牌以验证它是否为 valid/expired、

所以在我的 angular 登录服务中,我有一个这样的方法。

isUserlogged() {
  return this.httpClient.get(`${this.URL}/verifyToken`, { headers: { 'authorization': localStorage.getItem('token') } })   
}

此订阅 return 是一个布尔值,在这里一切正常。

现在我正在我的应用程序中实现 Guards,所以现在我想为我的 canActivate 方法使用该布尔值来阻止访问...我读到我需要 return,true 或 false此方法允许或阻止访问我之前配置的路由

所以我在 canActivate 中做了类似的事情。

this.loginService.isUserlogged().subscribe((response: boolean)=>{  

if(response){
   return true;
}
   return false;
});

但这是 returning 无效...为什么?我如何从该订阅中检索真值或假值?

不要 return 从路由内部订阅守卫,如果不是布尔值,则 return 布尔值的 Observable。

return this.loginService.isUserlogged()

因为 "isUserlogged" 已经在这里给你一个布尔值输出,你可以直接 return Observable。

如果 isUserlogged() 不是 return 布尔值,则通过管道传递它。

return this.loginService.isUserlogged().pipe(
    map((resp) => {
        // some logic here, check the return.
        // based on the logic
        if (something) {
            return true
        }
        return false
    })
)

如果您的 API 通话结束并且 return 得到正确响应,这一切都将有效。如果您的 API return 无效,则说明您没有提供有关 API 通话和 API 作品的任何详细信息。 (首先使用 HTTP 客户端测试您的 API,例如:Postman,如果给出了正确的响应,则将其与 Angular 集成)

我的解决方案,Promise Method 和一个健康的 运行 守卫。


canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {

    return this.mailVerifyControl()
      .then(() => {
        return true;
      })
      .catch((err) => {
        return false;
      });
  }


  mailVerifyControl(): Promise<boolean> {
    return new Promise((resolve, reject) => {
      if (this.authService.isMailVerified === true) {
        reject()
      }
      resolve();
    });
  }