1.7. CORS
通常,HTTP 客户端无法在不同域中发布请求。
例如,假设 Kafka Bridge 您与 Kafka 集群一起部署,可以使用 http://my-bridge.io 域访问。HTTP 客户端可以使用 URL 与 Kafka Bridge 交互,并通过 Kafka 集群交换信息。但是,您的客户端作为 http://my-web-application.io 域中的 Web 应用程序运行。客户端(源)域与 Kafka Bridge (目标)域不同。由于同一原始策略限制,来自客户端的请求会失败。您可以使用 Cross-Origin Resource Sharing (CORS)来避免这种情况。
CORS 允许在不同的域中的原始源之间的 simple 和 preflighted 请求。
简单的请求适用于使用 GET、HEAD、POST 方法的标准请求。
preflighted 请求发送 HTTP OPTIONS 请求,作为初始检查实际请求是否安全发送。在确认时,会发送实际请求。preflight 请求适合需要更大的保护方法,如 PUT 和 DELETE,并使用非标准标头。
所有请求都需要在其标头中有一个 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
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'
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: *
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
- 1
- 返回星号(
*)显示可由任何域访问的资源。
1.7.2. preflighted 请求 复制链接链接已复制到粘贴板!
初始 preflight 请求使用 OPTIONS 方法发送到 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 Access-Control-Request-Headers: Content-Type
OPTIONS /my-group/instances/my-consumer/subscription HTTP/1.1
Origin: http://my-web-application.io
Access-Control-Request-Method: POST
Access-Control-Request-Headers: 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'
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
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
如果 origin 或 方法被拒绝,则返回错误消息。
实际请求不需要 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'
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
HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://my-web-application.io