验证graphql查询

验证graphql查询,graphql,apollo,Graphql,Apollo,我正在构建一个简单的平台,使用graphql作为api网关和一个向该api发送一些查询的前端,我不知道如何在运行查询之前验证查询,以避免运行恶意查询。我想用,但我注意到它现在已经存档了,所以我不确定使用它是否是个好主意,第二个问题是,api和前端处于两个不同的回购协议中,因此我还没有找到在前端中白名单查询并在api中使用此白名单的解决方案…使用graphql白名单查询的最佳解决方案是什么 如果您担心的是根据请求人限制对某些字段的访问,那么您应该实施某种授权策略。您可以使用有关登录用户的信息填充上

我正在构建一个简单的平台,使用graphql作为api网关和一个向该api发送一些查询的前端,我不知道如何在运行查询之前验证查询,以避免运行恶意查询。我想用,但我注意到它现在已经存档了,所以我不确定使用它是否是个好主意,第二个问题是,api和前端处于两个不同的回购协议中,因此我还没有找到在前端中白名单查询并在api中使用此白名单的解决方案…使用graphql白名单查询的最佳解决方案是什么

如果您担心的是根据请求人限制对某些字段的访问,那么您应该实施某种授权策略。您可以使用有关登录用户的信息填充上下文,然后在要保护的字段的解析程序中使用此信息来确定是否应返回字段的值

const resolvers = {
  User: {
    somePrivateField: (user, args, ctx) => {
      // Make sure the request is from a logged in user and the user making the
      // request is the same as the requested user OR the user is an admin
      if (ctx.user && ( ctx.user.id === user.id || ctx.user.isAdmin )) {
        return user.somePrivateField
      }

      // throw an error or just return null or undefined to resolve the field to
      // null in the event authorization fails
    }
  }
}
更复杂的策略可以使用或使用现有的库,如


当然,您的数据库模型中可能存在的某些字段(如密码)从一开始就不应该在API中公开。

您试图避免哪种“恶意”查询?这不是我的特例,但最好解释一下我的问题背后的原因,假设我们有一个具有不同道具(电子邮件、姓名、姓氏、密码、ecc…)的用户列表,我想显示我的用户的姓名,我将运行一个查询,询问姓名和姓氏,但任何人都可以简单地获得查询并添加电子邮件/密码并获得它们…(psw通常是加密的,但仍然不好)…这就是为什么我想使用查询白名单…嗯,好吧,这是有道理的,但我更喜欢有一些持久的查询白名单,但我可能会这样做…谢谢!