Javascript CORS标头中缺少令牌‘;访问控制允许标头’;从CORS飞行前频道

Javascript CORS标头中缺少令牌‘;访问控制允许标头’;从CORS飞行前频道,javascript,cors,Javascript,Cors,后端返回 Access-Control-Allow-Headers: * 我有一个这样的要求 fetch('url-here', { // ... headers: { 'X-Auth': token, } }) 它在Chrome上运行,但在Firefox上我得到了 已阻止跨源请求:同一源策略不允许读取位于的远程资源。(原因:CORS飞行前通道的CORS标头“Access Control Allow Headers”中缺少令牌“X-Auth”。[了解更

后端返回

Access-Control-Allow-Headers: *
我有一个这样的要求

fetch('url-here', {
    // ...
    headers: {
        'X-Auth': token,
    }
})
它在Chrome上运行,但在Firefox上我得到了

已阻止跨源请求:同一源策略不允许读取位于的远程资源。(原因:CORS飞行前通道的CORS标头“Access Control Allow Headers”中缺少令牌“X-Auth”。[了解更多信息]跨源请求被阻止:同源策略不允许读取远程资源。(原因:CORS请求未成功)


问题是,一些浏览器还不允许使用
*
通配符作为
访问控制允许标题。值得注意的是,Firefox69和更早版本没有。看

因此,为了确保在所有浏览器中都能获得预期的行为,您发回的
Access Control Allow Headers
值应该明确列出您实际需要从前端代码访问的所有头名称;e、 例如,对于问题中的情况:
访问控制允许标头:X-Auth

一种不需要硬编码所有头名称的方法是:让服务器端代码获取浏览器发送的
Access Control Request Headers
请求头的值,然后将其回显到服务器发送回的
Access Control Allow Headers
response header的值中


或者使用一些现有库来启用服务器的CORS。将
访问控制请求标头
请求标头值回显到
访问控制允许标头
响应标头值是大多数CORS库通常会为您执行的操作。

可能与此相关:@Sirence或this:重要注意:响应认证请求时,服务器必须指定域,并且不能使用wild carding:在下面的url中查看我的答案:@zerkms我更新了规范url以引用该位置,而不是现在过时的(ES2018)位置。当前的MDN策略是始终使用
{{SpecName('ESDraft',…)}}
宏来引用ES规范(而不是使用
{{SpecName('ES2018',…)}
或任何旧的ES规范版本)。如果你想讨论这一政策,irc.mozilla.org上的#mdn频道是个好地方。或者@zerkms是的,这是一个判断性的调用,但在子树的特殊情况下,调用是由Florian Scholz发出的,他是指定的维护者。他的要求就是我在这里提到的:该规范引用了ES6规范,所有版本都应该如此。将规范URL添加到浏览器兼容性数据repo:时也会出现这种情况。为此,我们专门使用URL。