Cross-Origin KrakenD 的读取阻塞 (CORB) 问题 - "application/json" 来自 POST 的响应被 Chrome 拒绝
Cross-Origin Read Blocking (CORB) problem with KrakenD - "application/json" response from POST rejected by Chrome
auth.js:84 Cross-Origin Read Blocking (CORB) blocked cross-origin response http://myserver/auth with MIME type application/json.
这也不适用于 Firefox,尽管 Firefox 错误消息更为通用。奇怪的是,Firefox 的网络面板显示我想要的响应实际上已送达,浏览器只是不接受将其传递到我的 JavaScript 代码的响应。
这是我的 krakend.json
文件中的 CORS 设置:
"github_com/devopsfaith/krakend-cors": {
"allow_origins": ["http://localhost:61552"],
"allow_headers": ["Origin", "Authorization", "Content-Type", "Accept", "X-Auth-Token", "Referer", "User-Agent"],
"expose_headers": ["Content-Type", "Content-Length"],
"allow_credentials": true,
"allow_methods": ["GET", "HEAD", "POST", "OPTIONS"]
}
这是被调用的特定端点:
"endpoints": [{
"endpoint": "/auth",
"method": "POST",
"output_encoding": "no-op",
"extra_config": {
"github.com/devopsfaith/krakend-ratelimit/juju/router": {
"maxRate": 20,
"clientMaxRate": 8,
"strategy": "ip"
}
},
"backend": [{
"url_pattern": "/connect/token",
"encoding": "no-op",
"sd": "dns",
"host": ["identity-server.service.consul"],
"disable_host_sanitize": true
}]
},
我的 JavaScript 请求如下所示:
xhr.open('POST', url);
xhr.setRequestHeader('Accept', 'application/json');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.withCredentials = true;
xhr.onreadystatechange = function () {
...
}
xhr.send(...
我想尝试将响应的内容类型更改为 text/plain
以防万一,但我目前无法访问生成该响应的代码,我也没有知道这是否有帮助。
当我从 node.js 服务器或像 Postman 这样的应用程序发出同样的请求时,一切都会正确返回,并且 headers 我想看到我认为应该足够了让 CORS 开心的存在 (access-control-allow-credentials: true
, access-control-allow-origin: *
)
我终于找到了答案。
第一个问题是,当使用 xhr.withCredentials = true
时,它不足以获得 access-control-allow-origin: *
的响应 header。响应header必须包含请求本身的原始来源,例如access-control-allow-origin: https://example.com
.
第二个问题是kraken使用的CORS模块处理通配符域的方式。如果您使用 "allow_origins": []
或 "allow_origins": ["*"]
,服务器无论如何都会响应 access-control-allow-origin: *
。
但是,我不想将所有可能想要使用该服务器的主机都列入白名单。
幸运的是,有人能够向我指出 kraken 用来处理 CORS 的源代码(在 https://github.com/rs/cors),事实证明,如果您使用 [= 以外的任何其他类型的通配符表达式16=] 对于所有内容,如 "http*"
,然后服务器回显原始主机,一切正常!我现在的配置是:
"allow_origins": ["http*"]
注意:这样做可能 危险 !如果您将敏感数据放入 cookie,则相同的数据可以通过这种方式提供给任何其他网站。
auth.js:84 Cross-Origin Read Blocking (CORB) blocked cross-origin response http://myserver/auth with MIME type application/json.
这也不适用于 Firefox,尽管 Firefox 错误消息更为通用。奇怪的是,Firefox 的网络面板显示我想要的响应实际上已送达,浏览器只是不接受将其传递到我的 JavaScript 代码的响应。
这是我的 krakend.json
文件中的 CORS 设置:
"github_com/devopsfaith/krakend-cors": {
"allow_origins": ["http://localhost:61552"],
"allow_headers": ["Origin", "Authorization", "Content-Type", "Accept", "X-Auth-Token", "Referer", "User-Agent"],
"expose_headers": ["Content-Type", "Content-Length"],
"allow_credentials": true,
"allow_methods": ["GET", "HEAD", "POST", "OPTIONS"]
}
这是被调用的特定端点:
"endpoints": [{
"endpoint": "/auth",
"method": "POST",
"output_encoding": "no-op",
"extra_config": {
"github.com/devopsfaith/krakend-ratelimit/juju/router": {
"maxRate": 20,
"clientMaxRate": 8,
"strategy": "ip"
}
},
"backend": [{
"url_pattern": "/connect/token",
"encoding": "no-op",
"sd": "dns",
"host": ["identity-server.service.consul"],
"disable_host_sanitize": true
}]
},
我的 JavaScript 请求如下所示:
xhr.open('POST', url);
xhr.setRequestHeader('Accept', 'application/json');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.withCredentials = true;
xhr.onreadystatechange = function () {
...
}
xhr.send(...
我想尝试将响应的内容类型更改为 text/plain
以防万一,但我目前无法访问生成该响应的代码,我也没有知道这是否有帮助。
当我从 node.js 服务器或像 Postman 这样的应用程序发出同样的请求时,一切都会正确返回,并且 headers 我想看到我认为应该足够了让 CORS 开心的存在 (access-control-allow-credentials: true
, access-control-allow-origin: *
)
我终于找到了答案。
第一个问题是,当使用 xhr.withCredentials = true
时,它不足以获得 access-control-allow-origin: *
的响应 header。响应header必须包含请求本身的原始来源,例如access-control-allow-origin: https://example.com
.
第二个问题是kraken使用的CORS模块处理通配符域的方式。如果您使用 "allow_origins": []
或 "allow_origins": ["*"]
,服务器无论如何都会响应 access-control-allow-origin: *
。
但是,我不想将所有可能想要使用该服务器的主机都列入白名单。
幸运的是,有人能够向我指出 kraken 用来处理 CORS 的源代码(在 https://github.com/rs/cors),事实证明,如果您使用 [= 以外的任何其他类型的通配符表达式16=] 对于所有内容,如 "http*"
,然后服务器回显原始主机,一切正常!我现在的配置是:
"allow_origins": ["http*"]
注意:这样做可能 危险 !如果您将敏感数据放入 cookie,则相同的数据可以通过这种方式提供给任何其他网站。