【问题标题】:GraphQL Request: Determine requested resource directly out of requestGraphQL 请求:直接根据请求确定请求的资源
【发布时间】:2021-05-20 07:08:22
【问题描述】:

与 REST 不同,GraphQL 只有一个端点,通常称为 /graphql。 通过将授权外包给单独的上游服务(例如,将授权外包给 Nginx / Envoy 与 Open Policy Agent 等代理)并使用路径和 HTTP 动词进行决策,我在 REST 方面有很好的经验。例如,GET /billing 路由只能由具有 JWT 角色声明“会计”的用户使用。

现在我正在寻找一种方法来适应 GraphQL。 我发现的唯一可能性是在请求正文中解释查询,例如:

body: {
  query: 'query {\r\n  cats {\r\n    id,\r\n    name\r\n  }\r\n}\r\n'
}

但是,这似乎相当复杂且容易出错,因为必须外包大量知识和逻辑,特别是因为代理(分别是 OPA/其他授权解决方案)不一定具有任何 GraphQL 功能.

有没有更好的方法来可靠地识别 GraphQL 请求中请求的解析器​​/查询/突变/实体?客户端设置的标头和其他丰富内容不适合这里,对吧?

我将非常感谢任何方法!

【问题讨论】:

    标签: graphql reverse-proxy open-policy-agent


    【解决方案1】:

    这确实看起来很容易出错。 GraphQL 文档建议将 authorization 检查移至 business logic layer。为了完整起见,在此处引用他们的示例:

    // Authorization logic lives inside postRepository
    var postRepository = require('postRepository');
     
    var postType = new GraphQLObjectType({
      name: ‘Post’,
      fields: {
        body: {
          type: GraphQLString,
          resolve: (post, args, context, { rootValue }) => {
            return postRepository.getBody(context.user, post);
          }
        }
      }
    });
    

    因此,authz 检查不是尝试解析查询,而是在解析器中完成。可以在来自 OPA contrib repo 的 issue 中找到有关将 OPA 与 GraphQL 结合使用的一些讨论。

    【讨论】:

    • 感谢您的回复,我在研究过程中也遇到了 OPA 的问题。我想除了直接在解析器中解决 authZ 之外确实没有其他选择。太糟糕了,我害怕那个。前期和外包会更加优雅和高效。
    猜你喜欢
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    相关资源
    最近更新 更多