尽管未设置 Access-Control-Allow-Credentials,但出现 CORS 错误

Posted

技术标签:

【中文标题】尽管未设置 Access-Control-Allow-Credentials,但出现 CORS 错误【英文标题】:I'm getting a CORS error although Access-Control-Allow-Credentials is not set 【发布时间】:2016-03-15 16:20:57 【问题描述】:

我用 node.js 和 express 编写了一个服务器应用程序。该应用程序使用 cors 节点包来发送来自 "*" 的 POST 请求,因为我需要能够从移动应用程序发布。

以下是在应用中启用 CORS 的方式:

var cors = require('cors');

var app = express();

app.configure(function() 
  app.use(cors());
);

当我尝试从浏览器发布请求时,我收到此错误:

XMLHttpRequest 无法加载 url。当凭证标志为真时,不能在“Access-Control-Allow-Origin”标头中使用通配符“*”。因此不允许访问 Origin 'null'。

但是,我在响应中看不到任何 Access-Control-Allow-Credentials 标头。这是失败的请求和 Chrome 网络选项卡中的响应:

为什么它抱怨credentials 标志?

【问题讨论】:

能否向我们展示如何在您的应用中启用和配置 CORS? 我添加了一个代码sn-p。 请注意 app.configure 在 Express 4.x 中被删除 github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.x 【参考方案1】:

我们终于解决了这个问题。以下是我们的发现和导致我们找到解决方案的思路:

CORS 问题仅发生在 POST 中,而不是 GET。 CORS 问题仅在我从 URL 以 file:// 开头的本地 html 发出请求时发生。当我向http://localhost 请求时没有问题。 当从file:// 协议发起一个POST 请求时,来源是null。原来问题在于null 没有被通配符* 覆盖。 将Allow-Access-Control-Origin 设置为null 是不够的,因为显然来自源null 的请求包含凭据,所以我不得不将Allow-Access-Control-Credentials 设置为true

这是我更新的服务器代码,它接受来自任何来源的 POST 请求,包括与 file:// 一起使用的移动应用程序中的 Web 视图:

var cors = require('cors');

var app = express();

app.configure(function() 
  app.use(cors( origin: 'null', credentials: true ));
);

【讨论】:

以上是关于尽管未设置 Access-Control-Allow-Credentials,但出现 CORS 错误的主要内容,如果未能解决你的问题,请参考以下文章

尽管未设置但抛出 E_STRICT 消息

尽管未设置 Access-Control-Allow-Credentials,但出现 CORS 错误

Chrome Beta 问题:尽管 SameSite cookie 设置为“无”且安全,但未收到第三方 cookie

尽管正在执行DataLayer推送,但未触发Google跟踪代码管理器代码

尽管已安装 Python 模块,但未检测到它们

尽管我在服务器上在线,但 MultiUserChat 总是返回未连接