gpt4 book ai didi

node.js - Nestjs授权时如何提取JWT

转载 作者:行者123 更新时间:2023-12-05 02:59:47 26 4
gpt4 key购买 nike

我的目的是做一个角色守卫来验证用户的权限。我试图提取授权 header 以获取 JWT 中包含的角色信息。我实现了 canActivate 接口(interface)来检查使用的角色,但我不知道如何从 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,
);
}
}

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

一起工作

最佳答案

一种选择是使用 JwtModule 中的 JwtService 并使用 jwtService.decode(myJwt) 获取解码后的 JWT 并获取从那里的作用。另一种是使用内置的 Passport Guard (AuthGuard),扩展功能,并在自定义逻辑之前调用 super.canActivate(context)。存储结果并在继续您的自定义逻辑之前立即检查用户是否具有通行证访问权限。

// the mention of jwt in the AuthGuard is only needed if not working with defaultStrategy
export class RolesGuard extends AuthGuard('jwt') {
constructor(private readonly _reflector: Reflector) {
super()
}

canActivate(context: ExecutionContext): boolean {
const passportActive = super.canActivate(context);
if (!passportActivate) {
throw new HttpException(
'You do not have permission (Roles)',
HttpStatus.UNAUTHORIZED,
);
}
const roles = this._reflector.get<UserRole[]>(
'roles',
context.getHandler(),
);

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

const request = context.switchToHttp().getRequest();
// this should come from passport
const user: InstanceType<User> = request.user;

// 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,
);
}
}

关于node.js - Nestjs授权时如何提取JWT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57518718/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com