graphql - 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 请求中请求的解析器/查询/突变/实体?客户端设置的标头和其他丰富内容不适合这里,对吧?
我将非常感谢任何方法!
解决方案
这确实看起来容易出错。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 结合使用的讨论。
推荐阅读
- javascript - DOM 操作在用户代理字符串函数中不起作用
- sql - 具有相似 ID 的内部联接
- sql-server - 如何在没有 SQL Server 的 Windows 服务器中注册 Microsoft.SqlServer.ManagedDTS dll
- apache-spark - pyspark:将字符串转换为结构
- java - Java Servlet 写入输出流
- python - 如何在按钮单击时从 html 调用 python 函数并显示函数返回的结果
- google-chrome - 将 chrome 驱动程序更新为 80 后的 MoveTargetOutOfBoundsException
- python - 如何防止在 GET 请求后调用`GET /favicon.ico HTTP/1.1`
- python - 在烧瓶 python 中运行“python3 wsgi.py”时出现此错误
- processing - How would I snap a position to a rectangular grid?