云路由器配置
了解如何在 GraphOS Studio 中配置云路由器
创建云层supergraph后,您可以从“云路由器”页面管理其路由器配置。GraphOS Studio.
“常规”选项卡显示了以下信息:
- 您的路由器GraphQL端点的URL
- 每个云路由器的URL都在子域
apollographos.net
上。
- 每个云路由器的URL都在子域
- 您的路由器的当前状态和发布历史
从“配置”选项卡中,您可以管理以下内容:
管理密钥
您可以将可用的密钥字符串存储在您的路由器的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 subgraphsrequest:- propagate:matching: ^upstream-header-.*- remove:named: 'x-legacy-account-id'subgraphs:products: # Header rules for just the products subgraphrequest:- 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'
规则排序
头部规则按声明的顺序应用,后续规则可以覆盖早期规则的影响。考虑以下示例
❌
headers:all:request:- remove:named: 'test'- propagate:matching: .*
在此示例中,首先从传播头列表中删除名为test
的头。但是,当前的传播头列表为空!接下来,propagate
规则将所有头部添加到传播列表中,包括test
。
要正确地从传播列表中删除头部,确保您的remove
规则定义在所有propagate
规则之后:
✅
headers:all:request:- propagate:matching: .*- remove:named: 'test'
按照这个排序方式,首先将所有头部添加到传播列表中,然后删除test
头部。
示例
以下是一个完整示例,演示了所有支持的headers
配置选项:
headers:# Header rules for all subgraphsall: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 rulessubgraphs: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设置
默认情况下,路由器仅启用 GraphOS Studio 以发起与它的浏览器连接。如果您的 supergraph 为其他基于浏览器的应用程序提供数据,您需要在 cors
部分中执行以下操作之一,以 路由器配置 YAML:
将这些网络应用程序的来源添加到路由器的允许列表中
origins
.- 如果已知有限数量的网络应用程序消耗您的云 supergraph,则使用此选项。
将匹配这些网络应用程序来源的正则表达式添加到路由器的允许列表中
origins
.- 如果想要匹配模式,此选项很有用,请参见以下示例,它匹配特定命名空间的下级域名。
启用
allow_any_origin
选项。- 如果您的超级图是具有任意多个网络应用程序消费者的公开API,则使用此选项。
- 启用此选项后,路由器将发送 通配符(
*
) 值作为Access-Control-Allow-Origin
头。这使任何网站都可以发起与它的浏览器连接(但它们无法提供cookies或其他凭证)。
如果客户端需要使用cookies来 对他们的请求进行认证,则必须使用
origins
+match_origins
选项。
以下代码段包括每个选项的示例(使用 allow_any_origin
或 origins + 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 routermatch_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_credentials
为true
,如下所示:
cors:origins:- https://www.your-app.example.com- https://studio.apollographql.comallow_credentials: true
有关从Apollo 客户端发送cookie和授权头的示例,请参阅身份验证。
所有 cors
选项
以下代码片段显示了您的路由器的所有 CORS 配置默认值:
## CORS (Cross Origin Resource Sharing)#cors:# Set to true to allow any originallow_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` headerallow_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 trueallow_headers: []# Allowed request methodsmethods:- 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 subraphssubgraphs:products: false # Do not propagate errors from the products subgraph
位于subgraphs
键下的任何配置都优先于位于all
键下的配置。在上面的示例中,除了products
子图外,所有子图的子图错误都被包含在内。
内省
默认情况下,您的云supergraph不解析内省查询。您可以如下启用内省:
# Do not enable introspection for production workloads!supergraph:introspection: true