1.7. CORS
通常,HTTP 客户端无法在不同域间发出请求。
例如,假设您与 Kafka 集群一同部署的 Kafka Bridge 可以使用 http://my-bridge.io 域访问。HTTP 客户端可以使用 URL 与 Kafka Bridge 交互,并通过 Kafka 集群交换信息。但是,您的客户端作为 web 应用程序在 http://my-web-application.io 域中运行。客户端(源)域与 Kafka Bridge (目标)域不同。由于相同的策略限制,来自客户端的请求会失败。您可以使用跨资源共享(CORS)来避免这种情况。
CORS 允许在不同的域中的原始源之间的 simple 和 preflighted 请求。
简单请求适用于使用 GET、HEAD 和POST 方法的标准请求。
预先修改的请求将 HTTP OPTIONS 请求作为初始检查,用于检查实际请求是安全的发送。确认时会发送实际请求。preflight 请求适合需要更大保护的方法,如 PUT 和 DELETE,并使用非标准标头。
所有请求都需要在其标头中有一个 origin 值,即 HTTP 请求的来源。
您可以通过 CORS 指定在 Kafka Bridge HTTP 配置中访问 Kafka 集群的方法和原始 URL。
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.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
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'
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
如果 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'
该响应显示允许原始 URL。
HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://my-web-application.io