gpt4 book ai didi

graphql - 使用 graphql 在 Nestjs 中授权

转载 作者:行者123 更新时间:2023-12-04 12:56:22 26 4
gpt4 key购买 nike

我已经开始学习 Nestjs、express 和 graphql。
我在尝试授权使用 jwt token 进行身份验证的用户访问时遇到问题。
我遵循了 Nestjs website 上的身份验证教程.
我能够获得当前用户,但是当我尝试实现 basic role base access control 时,我无法在 canActivate 方法中访问当前用户。
我认为是因为在 Graphql Guard 之前执行了 Roles Guard。
我会在这里发布代码
gql-auth.guard.ts

import { ExecutionContext } from "@nestjs/common";
import { GqlExecutionContext } from "@nestjs/graphql";
import { AuthGuard } from "@nestjs/passport";

export class GqlAuthGuard extends AuthGuard("jwt") {
getRequest(context: ExecutionContext) {
const ctx = GqlExecutionContext.create(context);
console.log("gql simple context: ", context);
console.log("gqlContext: ", ctx.getContext());
return ctx.getContext().req;
}
}
角色.guard.ts
import { CanActivate, ExecutionContext, Injectable } from "@nestjs/common";
import { Reflector } from "@nestjs/core";
import { GqlExecutionContext } from "@nestjs/graphql";

@Injectable()
export class RolesGuard implements CanActivate {
constructor(private reflector: Reflector) {}

canActivate(context: ExecutionContext) {
const roles = this.reflector.get<string[]>("roles", context.getHandler());
const ctx = GqlExecutionContext.create(context);
console.log("roles: ", roles);
console.log("context: ", context.switchToHttp().getRequest());
console.log("gqlContext: ", ctx.getContext().req);

return true;
}
}
jwt.strategy.ts
import { Injectable } from "@nestjs/common";
import { PassportStrategy } from "@nestjs/passport";
import { ExtractJwt, Strategy } from "passport-jwt";
import { jwtConstants } from "../constants";

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor() {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: jwtConstants.secret,
});
}

validate(payload: any) {
console.log("payload: ", payload);

return payload;
}
}
解析器
@UseGuards(GqlAuthGuard)
@Roles("ADMIN")
@UseGuards(RolesGuard)
@Query((returns) => [Specialty], { nullable: "itemsAndList", name: "specialties" })
async getSpecialties(@Args() params: FindManySpecialtyArgs, @Info() info: GraphQLResolveInfo) {
const select = new PrismaSelect(info).value;
params = { ...params, ...select };
return this.prismaService.specialty.findMany(params);
}
有没有人成功实现过这个?

最佳答案

你应该在同一个 @UseGuards() 中使用这两个守卫装饰器。赞 @UseGuards(GqlAuthGuard, RolesGuard) . Nest 将按顺序运行这些,没有问题。

关于graphql - 使用 graphql 在 Nestjs 中授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66580508/

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