Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在Nestjs中授权时如何提取JWT_Node.js_Nestjs - Fatal编程技术网

Node.js 在Nestjs中授权时如何提取JWT

Node.js 在Nestjs中授权时如何提取JWT,node.js,nestjs,Node.js,Nestjs,我的目的是做一个角色守卫来验证用户的权限。我试图提取授权头以获取JWT上包含的角色信息。我实现了canActivate接口来检查角色的使用,但我不知道如何从JWT获取角色信息来验证它 export class RolesGuard implements CanActivate { constructor(private readonly _reflector: Reflector) { } canActivate(context: ExecutionContext): boolea

我的目的是做一个角色守卫来验证用户的权限。我试图提取授权头以获取JWT上包含的角色信息。我实现了canActivate接口来检查角色的使用,但我不知道如何从JWT获取角色信息来验证它

export class RolesGuard implements CanActivate {
  constructor(private readonly _reflector: Reflector) {
  }

  canActivate(context: ExecutionContext): boolean {
    const roles = this._reflector.get<UserRole[]>(
      'roles',
      context.getHandler(),
    );

    if (!roles || roles.length === 0) {
      return true;
    }

    const request = context.switchToHttp().getRequest();
    const user: InstanceType<User> = request.headers.role;

    // i want to get the role from JWT in here

    const hasRole = () => roles.indexOf(user.role) >= 0;

    if (user && user.role && hasRole()) {
      return true;
    }

    throw new HttpException(
      'You do not have permission (Roles)',
      HttpStatus.UNAUTHORIZED,
    );
  }
}
导出类RolesGuard实现CanActivate{
构造函数(专用只读反射器:反射器){
}
canActivate(上下文:ExecutionContext):布尔值{
const roles=this.\u reflector.get(
"角色",,
context.getHandler(),
);
如果(!roles | | roles.length==0){
返回true;
}
const request=context.switchToHttp().getRequest();
const user:InstanceType=request.headers.role;
//我想在这里得到JWT的角色
const hasRole=()=>roles.indexOf(user.role)>=0;
if(user&&user.role&&hasRole()){
返回true;
}
抛出新的HttpException(
'您没有权限(角色)',
HttpStatus.UNAUTHORIZED,
);
}
}

我尝试了扩展PassportStrategy,但它不能与CanActive

一起工作。一个选项是使用
JwtModule
中的
JwtService
并使用
JwtService.decode(myJwt)
获取解码后的JWT并从中获取角色。另一种方法是使用构建的Passport Guard(
AuthGuard
),扩展功能,并在自定义逻辑之前调用
super.canActivate(context)
。存储结果并立即检查用户是否具有passport访问权限,然后再继续自定义逻辑

//只有在不使用defaultStrategy时,才需要在AuthGuard中提及jwt
导出类RolesGuard扩展了AuthGuard('jwt'){
构造函数(专用只读反射器:反射器){
超级()
}
canActivate(上下文:ExecutionContext):布尔值{
const passportActive=super.canActivate(上下文);
如果(!passportActivate){
抛出新的HttpException(
'您没有权限(角色)',
HttpStatus.UNAUTHORIZED,
);
}
const roles=this.\u reflector.get(
"角色",,
context.getHandler(),
);
如果(!roles | | roles.length==0){
返回true;
}
const request=context.switchToHttp().getRequest();
//这应该是护照上的
const user:InstanceType=request.user;
//我想在这里得到JWT的角色
const hasRole=()=>roles.indexOf(user.role)>=0;
if(user&&user.role&&hasRole()){
返回true;
}
抛出新的HttpException(
'您没有权限(角色)',
HttpStatus.UNAUTHORIZED,
);
}
}

谢谢,我用了第一个建议,注入JwtService来处理。这对我有用。