auth.js:84交叉来源读取阻塞(CORB)阻止跨原点响应http://myserver/auth与MIME类型的应用程序/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服务器或者像邮递员这样的应用程序发出同样的请求时,一切都会恢复正常,我想看到的标题应该足够让CORS高兴了(access-control-allow-credentials: true
,access-control-allow-origin: *
)
发布于 2019-11-01 20:07:56
我终于找到了答案。
第一个问题是,当使用xhr.withCredentials = true
时,它不足以获得access-control-allow-origin: *
的响应头。响应头必须包含请求本身的原始来源,例如access-control-allow-origin: https://example.com
。
第二个问题是kraken使用的CORS模块处理通配符域的方式。如果您使用"allow_origins": []
或"allow_origins": ["*"]
,那么无论什么情况,服务器都会使用access-control-allow-origin: *
进行响应。
不过,我不想对所有想要使用此服务器的主机进行白名单。
幸运的是,有人向我指出了kraken用来处理CORS的源代码(在https://github.com/rs/cors),结果发现,如果您在任何事情上都使用了除"*"
之外的任何其他类型的通配符表达式,比如"http*"
,那么服务器就会回显原来的主机,一切都很好!我的配置现在是:
"allow_origins": ["http*"]
注意:这样做可能是危险的!如果您要将敏感数据放入cookie中,则其他任何网站都可以以这种方式获得相同的数据。
https://stackoverflow.com/questions/58650914
复制相似问题