跨域访问场景无法发送认证头

Posted

技术标签:

【中文标题】跨域访问场景无法发送认证头【英文标题】:Can't Send Authentication Header in Cross Origin Access Scenario 【发布时间】:2020-11-04 05:49:54 【问题描述】:

我在我的 Node.js 服务器上启用了跨源通信,以便我的 Vue 应用程序可以从与提供静态资产的源不同的源访问其 API。这是使用 Node.js 中的以下代码完成的:

res.setHeader('Access-Control-Allow-Origin', '*');

以及 Vue 中的以下 javascript 代码:

fetch(url);

在我引入基于 HTTP 标头的身份验证之前,这一直很好。使用该身份验证后,Vue 中的 JavaScript 代码从上面更改为:

fetch(url, headers: 'Authorization': bearer);

一旦引入 Authorization 标头,浏览器在尝试访问 API 时开始收到以下错误:

从来源访问“https://localhost:8001/articles”获取 http://localhost:8080' 已被 CORS 策略阻止:响应 预检请求未通过访问控制检查:否 'Access-Control-Allow-Origin' 标头出现在请求的 资源。如果不透明的响应满足您的需求,请设置请求的 模式为“no-cors”以获取禁用 CORS 的资源。

因此,似乎引入 HTTP 授权标头会导致预检请求无法通过预检测试。 Mozilla 文档似乎证实了这一概念:

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin

对于没有凭据的请求,文字值“*”可以是 指定为通配符;该值告诉浏览器允许请求 来自任何来源的代码以访问资源。尝试使用 带有凭据的通配符将导致错误。

那么,这是否意味着基于 HTTP 标头的身份验证根本无法在跨源请求的情况下实现?

更重要的是,如何在我的场景中实现基于 HTTP 标头的授权?

【问题讨论】:

【参考方案1】:

如果您使用的是快速服务器,请查看此软件包 [1]:https://expressjs.com/en/resources/middleware/cors.html

【讨论】:

成功!非常感谢。

以上是关于跨域访问场景无法发送认证头的主要内容,如果未能解决你的问题,请参考以下文章

Web Api 跨域基础认证

CSRF(跨域请求伪造)

Geoserver通过ajax跨域访问服务数据的方法(含用户名密码认证的配置方式)

跨域基本认证

跨域问题解决方法

跨域资源共享(Cross-Origin Resource Sharing)