Graphql NestJS-将用户数据从自定义身份验证保护传递到解析程序

Graphql NestJS-将用户数据从自定义身份验证保护传递到解析程序,graphql,jwt,nestjs,Graphql,Jwt,Nestjs,我知道默认passport AuthGuard(“yourStrategy”)经常会问这个问题, 但是还没有找到自定义身份验证的答案 为什么我使用自定义身份验证保护?因为默认值和GraphQL似乎无法一起工作。 由于GraphQL端进行了一些更新,默认的AuthGuard无法再读取标头 我需要以某种方式将从承载令牌获得的用户数据传递给解析器。 护照怎么办?你会怎么做?我对nestJS非常陌生,缺乏文档和/或道具教程让我抓狂 相关代码: auth.guard.ts @Injectable() ex

我知道默认passport AuthGuard(“yourStrategy”)经常会问这个问题, 但是还没有找到自定义身份验证的答案

为什么我使用自定义身份验证保护?因为默认值和GraphQL似乎无法一起工作。 由于GraphQL端进行了一些更新,默认的AuthGuard无法再读取标头

我需要以某种方式将从承载令牌获得的用户数据传递给解析器。 护照怎么办?你会怎么做?我对nestJS非常陌生,缺乏文档和/或道具教程让我抓狂

相关代码:

auth.guard.ts

@Injectable()
export class AuthGuard implements CanActivate {
    constructor(readonly jwtService: JwtService/*, readonly userService: UsersService*/) { }
    canActivate(context: ExecutionContext): boolean {
        const ctx = GqlExecutionContext.create(context);
        const request = ctx.getContext().request;
        const Authorization = request.get('Authorization');

        if (Authorization) {
            const token = Authorization.replace('Bearer ', '');
            const { userId, firstName } = this.jwtService.verify(token)  as { userId: string; firstName: string } ;

            return !!userId;
        }
    }
}
jwt.strategy.ts

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

  async validate(payload) {
    return {userId: payload.userId, firstName: payload.firstName};
  }
}
auth.module.ts

@Module({
    imports: [
        forwardRef(() => UserModule) , 
        PassportModule.register({
            defaultStrategy: 'jwt'
        }), 
        JwtModule.register({
            secret: jwtConstants.secret,
            signOptions: {expiresIn: 3600}
        })],
    providers: [AuthService, JwtStrategy, AuthResolver, AuthGuard],
    exports: [AuthService, JwtModule, AuthGuard]
})
export class AuthModule {

}
示例解析器

@UseGuards(AuthGuard)
@Resolver((of) => UserSchema)
export class UserResolver {
    constructor(private readonly userService: UserService) {}

  // ===========================================================================
  // Queries
  // ===========================================================================

 @Query(() => UserDto, {description: 'Searchs for a user by a given id'})
    async getUserById(@Args('id') id: string) {

     /*
      * Instead of passing the userID as an query argument, get it from the bearer token / auth guard!
      */
      const result = await this.userService.findById(id);
      if(result) return result;
      return new NotFoundException('User not found!');
    }
}
提前谢谢你的帮助!;-)


编辑:如果您需要查看更多代码,可以使用my github repo:

没关系。我自己也找到了解决办法。我找到了一个解决办法,让passport AuthGuard重新使用GraphQL。对于用户ID:使用自定义用户装饰器:

没关系。我自己也找到了解决办法。我找到了一个解决办法,让passport AuthGuard重新使用GraphQL。对于userId:使用自定义用户装饰器: