配置CORS
控制浏览器对您的路由器访问
默认情况下,路由器只能使GraphOS Studio来启动对它的连接。如果您的supergraph为其他基于浏览器的应用程序提供数据,您需要在其路由器's的cors's部分进行以下操作之一:cors
部分YAML配置文件:
将那些Web应用程序的来源添加到路由器允许的origins's列表中。
- 如果有已知的有限Web应用程序列表使用您的supergraph,请使用此选项。
将匹配那些Web应用程序来源的正则表达式添加到路由器允许的origins's列表中。
- 如果您想按模式匹配来源,此选项很有用,以下是一个示例,用于匹配特定命名空间的子域名。
启用
allow_any_origin
选项。- 如果您的supergraph是一个具有任意多数量的Web应用程序消费者的公开API,请使用此选项。
- 启用此选项后,router会发送通配符(
*
值作为Access-Control-Allow-Origin
头。这允许任何网站启动对其的浏览器连接(但他们无法提供cookies或其他凭证)。
如果客户端需要使用cookies验证其请求,您必须使用以下选项之一:origins,match_origins,或两种选项的组合。当使用两种选项时,请注意,origins会先于match_origins进行评估。
以下片段包含了每个选项的例子(使用allow_any_origin,或origins和/or 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: []
如果您的router仅服务于非浏览器式客户端,您可能不需要修改默认的CORS配置。
传递凭据
如果您的router需要将请求发送到包含用户凭据(例如,通过cookie),您需要修改您的CORS配置以告知浏览器这些凭据是被允许的。
您可以通过将Access-Control-Allow-Credentials
HTTP头部设置为true
启用凭据。
要允许浏览器将凭据传递到router,请将allow_credentials
设置为true
,如下所示:
cors:origins:- https://www.your-app.example.com- https://studio.apollographql.comallow_credentials: true
💡 提示
为了支持认证请求,您的router配置文件必须指定具体的origins
。如果您的router启用了allow_any_origin
,您的浏览器将拒绝发送凭据。
此外,您还需要配置router以将Cookie
头部传递到您的某些(或所有)子图中:
headers:all:request:- propagate:named: cookie
有关从Apollo Client发送cookie和授权头部的示例,请参阅认证。
cors
所有选项
以下片段展示了router的所有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: []# Adds the Access-Control-Max-Age header# Can be set to a duration in time units# If not set, the header is not includedmax_age: 2h
响应 Vary
标头
插件可以设置一个响应Vary
标头。如果所有插件都处理完毕后,没有响应Vary
标头,则router将添加一个值为"origin"的标头。