python-3.x - 如何发送包含扩展查询的 graphQL 查询?

标签 python-3.x graphql apollo-server graphene-python

我的一项服务上有一个 graphene.ObjectType 模型,它扩展了另一个服务中的定义

@extend(fields="id")
class ExtendedProtectedObject(graphene.ObjectType):
    id = external(graphene.ID(required=True))
    additional_color = graphene.String()

    class Meta:
        interfaces = (relay.Node,)

    def resolve_additional_color(self, info):
        return "blue"

    @staticmethod
    def _ExtendedProtectedObject__resolve_reference(root, info):
        # root is an instance of self class with id set to the query id value
        return root

我们运行 Apollo Federation 将所有 graphql 模式组合在一个位置并路由查询/突变等。 我可以在我的服务中添加什么查询作为单元测试,以反射(reflect)当我在additionalColor字段上请求时Apollo会做什么? 例如这个查询:

query getExtendedProtectedObject($id: ID!) {
    extendedProtectedObject(id: $id) {
        additionalColor
    }
}

联合将什么查询转发到我的服务? 我想在我的服务的一个单元测试中使用该查询,因为它在命中任何字段解析器之前调用 ExtendedProtectedObject 方法 _ExtendedProtectedObject__resolve_reference。

最佳答案

可以使用以下查询来做到这一点:

query ($representations:[_Any!]!) {
    _entities(representations:$representations) {
        ...on ExtendedProtectedObject {
            additionalColor
        }
    }
}

并使用这些查询变量:

variables=dict(
    representations=[{"__typename": "ExtendedProtectedObject", "id": to_global_id("ExtendedProtectedObject", 1)}],
)

the Apollo docs

客户端针对上述查询返回验证错误

请注意,当我尝试从客户端提交该查询时,它未能通过 Apollo 服务器验证步骤。当发送需要解析扩展 ObjectType 中的字段的正常查询时,联盟会在后台将此查询发送到您的服务。

如果验证关闭+查询可以命中服务的安全影响

因此,如果您关闭了验证,则可以使用此查询将响应仅定位到您的一项服务。如果关闭验证,对于像 Me 这样的类型,如果客户端可以成功执行此查询,则这可能是一个安全漏洞。这是因为它将允许查询设置外部全局 id 并直接命中服务,从而绕过 Me get_node 和 Me.resolve_id 的源,而只命中 Me._Me__resolve_reference 和任何特定于服务的解析器。这假设 id 是唯一的关键字段。

关于python-3.x - 如何发送包含扩展查询的 graphQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63044605/

相关文章:

python - 如何在 Python 3.7 中向 bytearray 添加字节?

python - 我希望确保列表中的项目不具有输入单词中不存在的重复元素

python - Json 文件中的列表框

reactjs - 使用 Apollo 替换 Redux 进行本地状态管理

reactjs - 如何将缓存恢复到初始状态

具有多对多关系的类型元素的 GraphQL 解析器

javascript - 如何修复导致空对象的循环依赖

node.js - 如何在 GraphQL 模式中使用 'Decimal' 作为字段类型?

python - python-3.3 的模拟工具

go - 使用 gorm Find() 检索多行时出现 fatal error