与我们一起参加10月8日至10日在纽约市的会议,学习有关 GraphQL 联邦和 API 平台工程的最新技巧、趋势和新闻。参加2024年在纽约市举行的 GraphQL Summit
文档
免费开始

云路由器配置

了解如何在 GraphOS Studio 中配置云路由器


创建云层后,您可以从“云路由器”页面管理其配置。GraphOS Studio.

“常规”选项卡显示了以下信息:

  • 您的路由器端点的URL
    • 每个的URL都在子域apollographos.net上。
  • 您的路由器的当前状态和发布历史

从“配置”选项卡中,您可以管理以下内容:

The Cloud Router page in GraphOS Studio

管理密钥

您可以将可用的密钥字符串存储在的YAML配置中。例如,您可能存储一个授权令牌,路由器需要将其包含在每个对的请求中。

要添加新密钥,单击保存密钥

在弹出的对话框中,输入密钥的名称和值。保存密钥后,您无法查看密钥的值,因此请确保在保存之前值是正确的。准备好后,单击保存密钥

您的密钥将被加密并存储。然后您可以在路由器的YAML配置中使用密钥的值。

以下示例YAML配置使用名为MY_SECRET的密钥的值:

headers:
all:
request:
- insert:
name: 'subgraph-token'
value: '${env.MY_SECRET}'

路由配置 YAML

您可以在路由配置 YAML中进行配置,以改变您路由器在云路由器标签或页面上的行为。

无服务器计划中,您可以配置:

  • HTTP 头部,这些头部信息会被路由器发送到您的。 addressed to your subgraphs
  • CORS 规则,用于连接到路由器的基于浏览器的应用程序
  • 子图错误包含,向查询客户端(包括 Apollo 探索器)暴露子图错误

专用和企业计划提供了更多配置选项。

如果您需要更高级的路由器定制,请联系我们,了解您的计划选项。

HTTP 头部规则

您可以为每个子图配置路由器请求中包含哪些 HTTP 头部。除了一般性子图头部规则外,您还可以定义针对所有子图的规则。

您在路由配置 YAML中定义头部规则,如下所示:

# ...other configuration...
headers:
all: # Header rules for all subgraphs
request:
- propagate:
matching: ^upstream-header-.*
- remove:
named: 'x-legacy-account-id'
subgraphs:
products: # Header rules for just the products subgraph
request:
- insert:
name: 'router-subgraph-name'
value: 'products'

支持的头部规则

云路由支持以下类型的头部规则

传播

允许您选择性地传递客户端请求中包含到路由器的头部。

您可以根据匹配的正则表达式模式来指定要传播哪些头部:

- propagate:
matching: .*

注意

路由器在按照模式传播时,永远不会传播所谓的端到端头信息,比如 Content-Length

或者,您可以通过named选项提供静态字符串。这些named配置具有额外的灵活性,因为它们支持以下选项:

  • default:客户端未发送值时设置的值
  • rename:将头键重命名为提供的值
- propagate:
named: 'x-user-id'
default: 'abc123'
rename: 'account-id'
删除

允许您有选择地从客户端请求路由器时包含的头信息中删除头部信息。像propagate一样,此选项可以匹配静态字符串或正则表达式。

# Do not send this subgraph the "Cookie" header.
- remove:
named: 'Cookie'
- remove:
# Remove headers that include the legacy 'x-' prefix.
matching: ^x-.*$
插入

允许您向特定的子图请求中添加自定义头部。这些头部始终是静态字符串,源自路由器,而不是客户端。

- insert:
name: 'sent-from-our-apollo-router'
value: 'indeed'

规则排序

头部规则按声明的顺序应用,后续规则可以覆盖早期规则的影响。考虑以下示例

bad_configuration.yaml
headers:
all:
request:
- remove:
named: 'test'
- propagate:
matching: .*

在此示例中,首先从传播头列表中删除名为test的头。但是,当前的传播头列表为空!接下来,propagate规则将所有头部添加到传播列表中,包括test

要正确地从传播列表中删除头部,确保您的remove规则定义在所有propagate规则之后:

good_configuration.yaml
headers:
all:
request:
- propagate:
matching: .*
- remove:
named: 'test'

按照这个排序方式,首先将所有头部添加到传播列表中,然后删除test头部。

示例

以下是一个完整示例,演示了所有支持的headers配置选项:

headers:
# Header rules for all subgraphs
all:
request:
# Propagate matching headers
- propagate:
matching: ^upstream-header-.*
# Propagate matching headers
- propagate:
named: 'some-header'
default: 'default-value'
rename: 'destination-header'
# Remove the "x-legacy-account-id" header
- remove:
named: 'x-legacy-account-id'
# Remove matching headers
- remove:
matching: ^x-deprecated-.*
# Insert the 'my-company' header
- insert:
name: 'my-company'
value: 'acme'
# Subgraph-specific header rules
subgraphs:
products:
request:
# Calls to the products subgraph have the "router-subgraph-name" header set to `products`.
- insert:
name: 'router-subgraph-name'
value: 'products'
accounts:
request:
# Calls to the accounts subgraph have the "router-subgraph-name" header set to `accounts`.
- insert:
name: 'router-subgraph-name'
value: 'accounts'

CORS设置

注意

如果您的路由器仅服务于非基于浏览器的客户端,您可能不需要修改默认的CORS配置。

有关CORS的更一般介绍和常见考虑事项,请参阅以下章节

默认情况下,路由器仅启用 GraphOS Studio 以发起与它的浏览器连接。如果您的 supergraph 为其他基于浏览器的应用程序提供数据,您需要在 cors 部分中执行以下操作之一,以 路由器配置 YAML:

  • 将这些网络应用程序的来源添加到路由器的允许列表中 origins.

    • 如果已知有限数量的网络应用程序消耗您的云 supergraph,则使用此选项。
  • 将匹配这些网络应用程序来源的正则表达式添加到路由器的允许列表中 origins.

    • 如果想要匹配模式,此选项很有用,请参见以下示例,它匹配特定命名空间的下级域名。
  • 启用 allow_any_origin 选项。

    • 如果您的超级图是具有任意多个网络应用程序消费者的公开API,则使用此选项。
    • 启用此选项后,路由器将发送 通配符(* 值作为 Access-Control-Allow-Origin 头。这使任何网站都可以发起与它的浏览器连接(但它们无法提供cookies或其他凭证)。
  • 如果客户端需要使用cookies来 对他们的请求进行认证,则必须使用 origins + match_origins 选项。

以下代码段包括每个选项的示例(使用 allow_any_originorigins + match_origins):

cors:
# Set to true to allow any origin
# (Defaults to false)
allow_any_origin: true
# List of accepted origins
# (Ignored if allow_any_origin is true)
# (Defaults to the GraphOS Studio url: `https://studio.apollographql.com`)
#
# An origin is a combination of scheme, hostname and port.
# It does not have any path section, so no trailing slash.
origins:
- https://www.your-app.example.com
- https://studio.apollographql.com # Keep this so GraphOS Studio can run queries against your router
match_origins:
- 'https://([a-z0-9]+[.])*api[.]example[.]com' # any host that uses https and ends with .api.example.com

您也可以通过将 origins 设置为空列表来完全关闭CORS:

cors:
origins: []

传递凭证

如果您的路由器需要请求包含用户的凭证(例如,通过cookies),您需要修改您的CORS配置以告诉浏览器这些凭证被允许。

您可以通过设置 Access-Control-Allow-Credentials HTTP头为 true 以启用凭证。

注意

您的路由器必须指定单个来源以支持认证请求。如果您的路由器启用了allow_any_origin,则浏览器将拒绝发送凭证。

要允许浏览器将凭证发送到您的路由器,设置allow_credentialstrue,如下所示:

cors:
origins:
- https://www.your-app.example.com
- https://studio.apollographql.com
allow_credentials: true

有关从发送cookie和授权头的示例,请参阅身份验证

所有 cors 选项

以下代码片段显示了您的路由器的所有 CORS 配置默认值:

#
# CORS (Cross Origin Resource Sharing)
#
cors:
# Set to true to allow any origin
allow_any_origin: false
# List of accepted origins
# (Ignored if allow_any_origin is set to true)
#
# An origin is a combination of scheme, hostname and port.
# It does not have any path section, so no trailing slash.
origins:
- https://studio.apollographql.com # Keep this so GraphOS Studio can still run queries against your router
# Set to true to add the `Access-Control-Allow-Credentials` header
allow_credentials: false
# The headers to allow.
# Not setting this mirrors a client's received `access-control-request-headers`
# This is equivalent to allowing any headers,
# except it will also work if allow_credentials is set to true
allow_headers: []
# Allowed request methods
methods:
- GET
- POST
- OPTIONS
# Which response headers are available to scripts running in the
# browser in response to a cross-origin request.
expose_headers: []

响应 Vary 头部

插件可以设置响应Vary头部。如果所有插件处理完毕后,没有响应Vary头部,则路由器将添加一个值设置为origin的头部。

Subgraph 错误包含

默认情况下,您的云supergraph在其响应中删除子图错误详情。路由器将返回一个默认错误,如下所示:

Subgraph errors redacted

此删除可以防止敏感信息泄露给客户。

如果您希望将子图错误传播给客户,则可以在路由器的 YAML 配置中添加include_subgraph_errors键,如下所示:

include_subgraph_errors:
all: true # Propagate errors from all subraphs
subgraphs:
products: false # Do not propagate errors from the products subgraph

位于subgraphs键下的任何配置都优先于位于all键下的配置。在上面的示例中,除了products子图外,所有子图的子图错误都被包含在内。

内省

默认情况下,您的云supergraph不解析内省查询。您可以如下启用内省:

# Do not enable introspection for production workloads!
supergraph:
introspection: true
上一页
概述
下一页
概述
评分文章评分在GitHub上编辑Edit论坛Discord

©2024Apollo Graph Inc.,商业名称为Apollo GraphQL。

隐私政策

公司