Node.js Socket.IO server.origins始终返回'*';作为原点值(Nodejs)

Node.js Socket.IO server.origins始终返回'*';作为原点值(Nodejs),node.js,sockets,nginx,socket.io,Node.js,Sockets,Nginx,Socket.io,我正在尝试构建一个双向socket.io服务器/客户端连接。服务器将保留在一个IP/域后面,而客户端将保留在另一个IP后面。关键是在服务器脱机时通知我,以防断电或服务器故障。我遇到的问题是,我正在尝试固定插座,这样就不仅仅是任何人都可以连接到插座。Socket.IO具有server.origins函数,该函数将返回尝试连接的套接字的原点。他们的API文档是这样解释的 io.origins((origin, callback) => { if (origin !== 'https://f

我正在尝试构建一个双向socket.io服务器/客户端连接。服务器将保留在一个IP/域后面,而客户端将保留在另一个IP后面。关键是在服务器脱机时通知我,以防断电或服务器故障。我遇到的问题是,我正在尝试固定插座,这样就不仅仅是任何人都可以连接到插座。Socket.IO具有server.origins函数,该函数将返回尝试连接的套接字的原点。他们的API文档是这样解释的

io.origins((origin, callback) => {
  if (origin !== 'https://foo.example.com') {
    return callback('origin not allowed', false);
  }
  callback(null, true);
});
我遇到的问题是,每当我使用socket.io-client连接到socket.io服务器时,原点总是“*”

在潜在缺陷下,API指出: 在某些情况下,当无法确定原点时,其值可能为*

如何获取socket.io它可以看到套接字连接请求来自的IP吗

一旦建立了连接,我可以使用套接字信息并查看套接字所在的IP,但连接已经建立。我正试图阻止胭脂接触

# Server
const express = require('express');
const app = express();
const chalk = require('chalk')
const server = require('http').createServer(app);
const io = require('socket.io')(server);
const cors = require('cors');

const port = 4424;

app.use(cors());

io.origins((origin, callback) => {
    console.log(origin);

    if (origin !== '*') {
        return callback('origin not allowed', false);
    }
    callback(null, true);
});

io.on('connection', (socket) => {
    console.log('Client connected...');

    socket.on('join', (data) => {
        console.log(data);
        socket.emit('messages', 'Hello from server');
    });
})

server.listen(port, () => console.log(chalk.blue(`Express started on port ${port}!`)));
客户:

# Client
const io = require('socket.io-client');

const socket = io('https://"MY DOMAIN THAT THE SERVER IS BEHIND"', { reconnect: true })

socket.on('connect', (data) => {
    console.log("Connection successful");
    socket.emit('join', 'Hello World from client');
});

socket.on('connect_error', (error) => {
    console.log("Connection error");
});

socket.on('disconnect', (timeout) => {
    console.log("Connection disconnected");
})

socket.on('messages', (data) => {
    console.log(data);
});

我的服务器位于使用SSL的NGINX服务器后面,并与另一个IP上的客户端连接到服务器,它通过并创建连接,但来源始终是“*”

事实上,我发现您可以使用带有Socket.io的中间件和io.use()函数。我刚刚编写了一个简单的中间件,它用一个已批准的ip列表检查传入的套接字ip

io.use((socket, next) => {
    const ip = socket.handshake.headers['x-forwarded-for']
    if (firewall(ip))
    {
        return next();
    }
})
防火墙是一种检查ip是否在已批准ip阵列中的功能

io.use((socket, next) => {
    const ip = socket.handshake.headers['x-forwarded-for']
    if (firewall(ip))
    {
        return next();
    }
})