我工作的公司的安全部门在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请求。
有人已经遇到过此问题吗?
任何帮助非常感谢
答案 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地址或域。