首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GraphQL:如何限制跨查询的字段服务器端?

GraphQL:如何限制跨查询的字段服务器端?
EN

Stack Overflow用户
提问于 2017-06-19 23:43:59
回答 1查看 6.2K关注 0票数 12

假设我有一个用户类型,其中包含以下字段:

代码语言:javascript
运行
复制
type User {
  name: String
  username: String
  someOtherField1: String
  someOtherField2: String
  someOtherField3: String
  someOtherField4: String
  creditCardNumber: String
}

如果我是在为自己查询,可以返回所有字段,因为信息是我的。因此,将creditCardNumber返回给客户机并不是什么大问题。但是,如果我是在查询其他人,我应该只能访问返回用户的公共信息。返回creditCardNumber将是可怕的。即使我不对客户机上的查询进行编码,如何防止恶意用户挖掘代码、更新客户端查询以包含creditCardNumber并执行它呢?

在GraphQL中实现这种级别的跨查询字段限制的最佳方法是什么?到目前为止,我唯一的想法是创建一个单独的UserSearch类型,即

代码语言:javascript
运行
复制
type UserSearch {
  name: String
  username: String
  someOtherField1: String
  someOtherField2: String
  someOtherField3: String
  someOtherField4: String
}

这不包括私有字段,但是这并不让人感到干燥,因为您将创建许多在结构形式上90%相似的类型。

是否有一种更干净的方法来实现这一点,而不是创建不必要的类型或重复的字段?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-20 09:26:32

默认情况下,GraphQL类型可能是类型,这意味着您可以向任何字段返回null。

这意味着,在resolve字段的creditCardNumber函数中,可以检查当前用户是否是被获取的用户,如果是,则返回数字。否则,返回null。

要访问当前用户之类的“上下文”数据,GraphQL允许您在执行graphql函数时传递一个对象context

代码语言:javascript
运行
复制
graphql(schema, query, rootValue, context) // <-- the last parameter

您将在每个字段resolve函数签名中找到该对象:

代码语言:javascript
运行
复制
...
resolve: (object, args, context) => {
  // Third argument is your object
},
....

因此,您可以做的是在上下文中传递当前日志记录的用户:

代码语言:javascript
运行
复制
graphql(schema, query, rootValue, { user: getCurrentLoggedUser() })

User类型中,在creditCardNumber字段解析函数中:

代码语言:javascript
运行
复制
creditCardNumber: {
  ...
  resolve: (user, args, context) => {
    if (user.id === context.user.id)
      return user.creditCardNumber;

    return null;
  },
  ...
}

如果您使用的是graphql-express,默认情况下上下文是请求你可以定制它

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44641553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档