socket.io CORS access-control-allowed-origin设置为*

时间:2017-11-21 16:39:04

标签: javascript node.js socket.io cors

我工作的公司的安全部门在socket.io请求上反对(正确地)Access-Control-Allow-Origin: *

应用程序根本没有使用CORS,这只是socket.io请求的问题。

这是我用来在服务器准备就绪后启动socket.io的函数:

exports.start = (server) => {
    io = exports.socketio.socket.listen(server, {
        origins: `https://${server.address().address}:*`,
        rejectUnauthorized: false,
        wsEngine: 'ws',
        transports: ['websocket', 'polling']
    });

    exports.connect();
};

问题在于: - server.address().address返回类似::的内容 - 我需要在具有不同地址的多个服务器上部署应用程序 - 之前没有origins属性,socket.io将原点设置为*

- 当我在本地计算机上测试解决方案时,origins to: 'https://localhost:3000'我仍然会收到Access-Controll-Allow-Origin: * 的一些socket.io请求。

enter image description here

有人已经遇到过此问题吗?

任何帮助非常感谢

1 个答案:

答案 0 :(得分:0)

自动server.address().address的问题在于,在生产中,您的服务器可能无法报告实际公开可见的服务器地址,因为该公共IP地址可能是负载均衡器或代理或类似的东西而且是公共的IP地址(浏览器连接到的地址)必须位于originins字段中。您的服务器本身可以拥有与您的域名公开关联的IP地址。

socket.io的CORS问题只是因为socket.io默认使用http轮询然后切换到实际的webSocket。 webSocket连接本身不受CORS限制。因此,您可以将客户端配置为仅与真正的webSocket连接,然后您就不会遇到任何CORS问题。

您只能在此处查看如何使用webSockets:Socket.io 1.x: use WebSockets only?

我知道的唯一缺点是你的socket.io连接在旧的不支持webSockets的浏览器中不起作用。对于可能仍在使用任何有意义数量的浏览器,这实际上只是IE11之前的IE版本,看起来大约是2.5%。一些人会争辩说,仍然使用IE8的人可能不那么精通互联网的用户,或者受到严格控制的公司,并且不太可能参与新的互联网服务,因此与新互联网服务的相关性甚至低于2.5%。

如果您感到好奇,微软在2016年1月宣布他们将停止支持早于IE11的IE版本的日期,并且所有这些日期已经过去(因此不再针对旧版本的IE修复常规错误)

另一种方法是创建一个配置文件,服务器在启动时读取该配置文件,而部署服务器的任何人都可以添加应该与CORS一起使用的公共IP地址或域。