首页 > 解决方案 > GraphQL 请求:直接根据请求确定请求的资源

问题描述

与 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 请求中请求的解析器​​/查询/突变/实体?客户端设置的标头和其他丰富内容不适合这里,对吧?

我将非常感谢任何方法!

标签: graphqlreverse-proxyopen-policy-agent

解决方案


这确实看起来容易出错。GraphQL 文档建议将授权检查移至业务逻辑层。为了完整起见,在这里引用他们的示例:

// 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的这个问题中找到一些关于将 OPA 与 GraphQL 结合使用的讨论。


推荐阅读