0

我正在尝试根据我在 JWT 令牌中收到的有效负载为我的路由创建一个防护。问题是我有第一个方法 (authService.getToken()) 返回 NbJWTAuthToken 的 Observable,然后我需要使用 token.getPayload() 中的令牌再次查询,然后检索有效负载。

这是我尝试但没有成功的方法:

@Injectable()
export class AdminGuard implements CanActivate {
    constructor(private authService: NbAuthService) { }

    canActivate() {

        return this.authService.getToken()
           .pipe(
               flatmap(token => token.getPayload()),
               tap((account:Account) => account.type === AccountType.ADMIN)
           );
    }
}

有任何想法吗?

4

1 回答 1

1

你非常接近。只需使用 Rxjs ' map ' 运算符而不是 ' tap '。

@Injectable()
export class AdminGuard implements CanActivate {
  constructor(private authService: NbAuthService) { }

  canActivate() {
    return this.authService.getToken()
      .pipe(
        flatmap(token => token.getPayload()),
        map((account:Account) => account.type === AccountType.ADMIN)
      );
  }
}

解释

canActivate()方法可以接受Observable<boolean>的返回类型。在您的 Observable 中,您使用的是不返回任何内容(void)的点击运算符。使用 map 运算符,您可以返回一个布尔结果(正如您在问题中已有的那样)。

于 2019-10-05T04:55:23.090 回答