Node.js 在Nestjs中授权时如何提取JWT
我的目的是做一个角色守卫来验证用户的权限。我试图提取授权头以获取JWT上包含的角色信息。我实现了canActivate接口来检查角色的使用,但我不知道如何从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
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来处理。这对我有用。