如何发送包含扩展查询的 graphQL 查询?
How do I send a graphQL query that contains an extended query?
我的一项服务中有一个 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 模式组合在一个位置并路由 queries/mutations 等。
我可以在我的服务中添加什么查询作为单元测试,它反映了当我在我的 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)}],
)
上述查询的客户端返回验证错误
请注意,当我尝试从客户端提交该查询时,它未能通过 Apollo 服务器验证步骤。当发送需要解析扩展 ObjectType 中的字段的普通查询时,联合会将此查询发送到您的服务。
验证关闭时的安全隐患 + 查询可以访问服务
因此,如果您关闭了验证,则可以使用此查询将响应定位到仅针对您的一项服务。如果关闭验证,对于像 Me 这样的类型,如果客户端可以成功执行此查询,则这可能是一个安全漏洞。这是因为它允许查询设置外部全局 ID 并直接命中服务,绕过 Me get_node 和 Me.resolve_id 的来源,而只命中 Me._Me__resolve_reference 和任何服务特定的解析器。这假定 id 是唯一的关键字段。
我的一项服务中有一个 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 模式组合在一个位置并路由 queries/mutations 等。 我可以在我的服务中添加什么查询作为单元测试,它反映了当我在我的 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)}],
)
上述查询的客户端返回验证错误
请注意,当我尝试从客户端提交该查询时,它未能通过 Apollo 服务器验证步骤。当发送需要解析扩展 ObjectType 中的字段的普通查询时,联合会将此查询发送到您的服务。
验证关闭时的安全隐患 + 查询可以访问服务
因此,如果您关闭了验证,则可以使用此查询将响应定位到仅针对您的一项服务。如果关闭验证,对于像 Me 这样的类型,如果客户端可以成功执行此查询,则这可能是一个安全漏洞。这是因为它允许查询设置外部全局 ID 并直接命中服务,绕过 Me get_node 和 Me.resolve_id 的来源,而只命中 Me._Me__resolve_reference 和任何服务特定的解析器。这假定 id 是唯一的关键字段。