Javascript 在具有通配符来源的CORS请求上设置cookie

Javascript 在具有通配符来源的CORS请求上设置cookie,javascript,ajax,cookies,cors,Javascript,Ajax,Cookies,Cors,我们操作一个可以从任何来源调用的公共API。为了允许调用,我们将所有CORS头设置为通配符,并且还设置了allow credentials头 Access-Control-Allow-Origin: * Access-Control-Allow-Headers: * Access-Control-Allow-Methods: * Access-Control-Allow-Credentials: true 通常我们通过自定义HTTP头进行身份验证,但对于一个特殊调用,我们也接受cookie。这

我们操作一个可以从任何来源调用的公共API。为了允许调用,我们将所有CORS头设置为通配符,并且还设置了allow credentials头

Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: *
Access-Control-Allow-Methods: *
Access-Control-Allow-Credentials: true
通常我们通过自定义HTTP头进行身份验证,但对于一个特殊调用,我们也接受cookie。这背后的原因是我们通过API提供的文件下载。我们首先通过显示进度指示器的AJAX下载该文件。作为此调用的一部分,我们设置文件放置在浏览器缓存中的所有缓存头。在下载到浏览器缓存中完成后,我们向页面添加一个隐藏的iframe,指向我们刚刚预取的文件。通过这种方式,我们希望强制浏览器从缓存中正常“下载”文件

如果浏览器缓存出错,浏览器对API进行HTTP调用,我们希望将cookie设置为包含身份验证令牌的文件请求的一部分。这样,浏览器将在iframe中打开文件时发送cookie。问题就出在这里:您不能将
访问控制允许来源
标题设置为通配符,而仍然使用
with credentials
设置。例如,Chrome将显示错误

XMLHttpRequest无法加载
https://myapihost/v1/file/1234
。回应 飞行前请求未通过访问控制检查:通配符“
*
” 当 凭据标志为true。来源“
http://myclientapp因此,
”不是 允许访问。XMLHttpRequest的凭据模式为 由
with credentials
属性控制

有什么好办法来处理这种情况吗?我能想到的唯一解决方案是在响应头中始终返回客户机发送的源代码

我了解安全方面,一般来说,向任何来源开放资源都不是一个好主意,但就我们的公共API而言,在任何来源上都可能有各种客户端应用程序。遗憾的是,在打开iframe时,无法告诉浏览器发送特定的头


我目前也在考虑下载预取文件,但在开始更大的返工之前,我想听听你的意见

拥有此特定资源的
访问控制允许凭据
始终返回客户端发送的源。如果仅为该特定资源设置,而该资源没有运行脚本的能力(似乎是这样),则不存在安全风险(例如,不存在意外的权限提升风险,这将允许攻击者以用户权限运行脚本以访问防火墙资源)。因此,我认为,如果您在这种特殊情况下总是返回客户端来源,那么您真的不必担心任何安全问题。谢谢您提供的信息。我找到了将源代码发送回客户机的解决方案。现在,客户不再抱怨了,我可以在API级别正确设置cookies。嘿,我知道这是旧的,但是你有关于如何解决这个问题的更多细节吗?我也有类似的问题。将源代码发送回客户端是什么意思?这是否允许您在CORS中保留通配符?在API服务器上,我们不再返回
*
通配符。我们向客户返回他发送给我们的确切来源。这意味着,当客户机打电话并在请求中向我们发送
Origin:mydomain.com
时,我们将在响应中返回头
访问控制允许Origin:mydomain.com
,而不是通配符。