1.7. CORS


通常,HTTP 客户端无法在不同域间发出请求。

例如,假设您与 Kafka 集群一起部署的 Kafka Bridge 可使用 http://my-bridge.io 域访问。HTTP 客户端可以使用 URL 与 Kafka Bridge 交互,并通过 Kafka 集群交换信息。但是,您的客户端在 http://my-web-application.io 域中作为 Web 应用程序运行。客户端(源)域与 Kafka Bridge (目标)域不同。由于相同的原始策略限制,来自客户端的请求会失败。您可以使用 Cross-Origin 资源共享(CORS)来避免这种情况。

CORS 允许在不同的域中的原始源之间的 simplepreflighted 请求。

简单请求适用于使用 GETHEADPOST 方法的标准请求。

preflighted 请求会发送 HTTP OPTIONS 请求,作为初始检查实际请求是否安全发送。确认时,发送实际请求。preflight 请求适用于需要更大的保护方法,如 PUTDELETE,并使用非标准标头。

所有请求都需要在其标头中有一个 origin 值,即 HTTP 请求的来源。

CORS 允许您指定允许的方法和原始 URL,以便在 Kafka Bridge HTTP 配置中访问 Kafka 集群。

Kafka Bridge 的 CORS 配置示例

# ...
http.cors.enabled=true
http.cors.allowedOrigins=http://my-web-application.io
http.cors.allowedMethods=GET,POST,PUT,DELETE,OPTIONS,PATCH

1.7.1. 简单请求

例如:这个简单请求标头将源指定为 http://my-web-application.io

Origin: http://my-web-application.io

标头信息添加到要使用记录的请求中。

curl -v -X GET HTTP-BRIDGE-ADDRESS/consumers/my-group/instances/my-consumer/records \
-H 'Origin: http://my-web-application.io'\
-H 'content-type: application/vnd.kafka.v2+json'

在 Kafka Bridge 的响应中,会返回一个 Access-Control-Allow-Origin 标头。它包含可从中向网桥发出 HTTP 请求的域列表。

HTTP/1.1 200 OK
Access-Control-Allow-Origin: * 1
1
返回星号(*)显示资源可以被任何域访问。

1.7.2. preflighted 请求

使用 OPTIONS 方法将初始 preflight 请求发送到 Kafka Bridge。HTTP OPTIONS 请求发送标头信息,以检查 Kafka Bridge 是否允许实际请求。

在这里,preflight 请求会检查 POST 请求是否从 http://my-web-application.io 有效。

OPTIONS /my-group/instances/my-consumer/subscription HTTP/1.1
Origin: http://my-web-application.io
Access-Control-Request-Method: POST 1
Access-Control-Request-Headers: Content-Type 2
1
Kafka Bridge 会警告实际请求是 POST 请求。
2
实际请求将使用 Content-Type 标头发送。

OPTIONS 被添加到 preflight 请求的标头信息中。

curl -v -X OPTIONS -H 'Origin: http://my-web-application.io' \
-H 'Access-Control-Request-Method: POST' \
-H 'content-type: application/vnd.kafka.v2+json'

Kafka Bridge 响应初始请求,以确认请求将被接受。响应标头返回允许的源、方法和标头。

HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://my-web-application.io
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS,PATCH
Access-Control-Allow-Headers: content-type

如果原始或方法被拒绝,则返回错误消息。

实际请求不需要 Access-Control-Request-Method 标头,因为它已在 preflight 请求中确认,但它需要 origin 标头。

curl -v -X POST HTTP-BRIDGE-ADDRESS/topics/bridge-topic \
-H 'Origin: http://my-web-application.io' \
-H 'content-type: application/vnd.kafka.v2+json'

响应显示允许原始 URL。

HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://my-web-application.io

其他资源

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.