【问题标题】:Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'当请求的凭据模式为“包含”时,响应中的 Access-Control-Allow-Origin 标头不得为通配符“*”
【发布时间】:2018-07-31 16:17:42
【问题描述】:

我有一个 socket.io 服务器正在运行,但我无法通过我的 mac 上的本地 html 文件连接到它。

错误:

加载失败 http://file/socket.io/?EIO=3&transport=polling&t=M6tFqlm: 的值 响应中的“Access-Control-Allow-Origin”标头不得为 当请求的凭据模式为“包含”时,通配符“*”。 因此,Origin 'null' 不允许访问。凭证模式 XMLHttpRequest 发起的请求由 withCredentials 属性。

服务器:

var app = require('express')();
var server = app.listen(8080);
var cors = require('cors');

app.options('*', cors());
var io = require('socket.io').listen(server);

....

// think this is redudant
server.listen(8080);

本地 HTML 文件(没有本地服务器运行)

<html>
<head>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.js"></script>
</head>
<body>

  <script src="../socket.io-client/dist/socket.io.js"></script>
<script>
    // Create SocketIO instance, connect

    // var socket = new io.Socket();
    var socket = io();


    //var socket = io('https://example.com:8080', { transport : ['websocket'] });
    socket.connect('https://example.com:8080'); 

    // Add a connect listener
    socket.on('connect',function() {
      console.log('Client has connected to the server!');
    });
    // Add a connect listener
    socket.on('message',function(data) {
      console.log('Received a message from the server!',data);
    });
    // Add a disconnect listener
    socket.on('disconnect',function() {
      console.log('The client has disconnected!');
    });

    // Sends a message to the server via sockets
    function sendMessageToServer(message) {
      socket.send(message);
    };
</script>
  <div id="date"></div>
  <textarea id="text"></textarea>
</body>
</html>

【问题讨论】:

  • 你试过把&lt;script src="../socket.io-client/dist/socket.io.js"&gt;&lt;/script&gt;改成&lt;script src="/socket.io/socket.io.js"&gt;&lt;/script&gt;
  • 查找 socket.io 客户端 js 文件不是问题。该错误是由于跨浏览器请求。我尝试了 CORS chrome 插件,但它们没有帮助。
  • 好的。接下来,你把这个app.options('*', cors());改成app.use(cors());了吗?
  • 是但失败了。
  • 您的节点 websocket 服务器是在多个实例(集群模式)还是 fork 模式下运行?我之前也遇到过类似的问题

标签: javascript node.js express socket.io


【解决方案1】:

根据MDN,您将 Access-Control-Allow-Credentials 标头设置为 include,这需要服务器指定该域可以访问 cookie 等。-这是有道理的 - 您不想将 cookie 或凭据发送到任何网站。

如果您只有一个不在任何地方托管的 HTML 文件,您所能做的就是禁用凭据,因此不会发送它们。我看过the internet,我认为您可以将其设置为:

var socket = io({
  extraHeaders: {
    'Access-Control-Allow-Credentials': 'omit'
  }
});

或者,您可以在浏览器中禁用 CORS,但当然,这是最后的手段,它会让您面临安全问题。

【讨论】:

  • 以上代码是给客户端的?我尝试了 CORS chrome 插件,但它们不起作用。
  • @jdog 是的,对于客户端。
  • 适合任何寻求解决方案的人。这个答案对我有用。但是,我不得不在 Firefox 中使用 CORS 插件和代码。 Chrome CORS 插件无法正常工作。
【解决方案2】:

CORS 让我很痛苦

但是你应该设置一个特定的域,它会对你有很大帮助。

var cors = require('cors')
var app = express()

var corsOptions = {
  origin: function (origin, callback) {
    if (any_logic_you_want) {
      //this is not tested, just copied from npm cors docs
      callback(null, true)
    } else {
      callback(new Error('Not allowed by CORS'))
    }
  }
}

app.use(cors(corsOptions));

【讨论】:

  • 我现在正在尝试那个确切的代码。问题是我在我的网站上使用了一个 html 页面,因此在白名单中设置某些内容将不起作用,因为它不是从特定域运行的。我假设上面的 example1.com 是客户端的域而不是服务器的域是否正确?
  • 是的,我的错。删除它。在这种情况下,我假设它假设设置您正在访问的域,所以您会很好。这里没有白名单,只是将访问的域设置成cors
猜你喜欢
  • 2018-12-16
  • 2021-11-18
  • 2018-11-09
  • 2020-11-10
  • 2018-07-29
  • 2023-03-07
  • 2021-04-17
  • 1970-01-01
  • 2018-01-13
相关资源
最近更新 更多