如何保护私人socket.io房间?

时间:2017-09-14 13:14:25

标签: javascript node.js sockets websocket socket.io

我想知道这是否是正确的方法来保护socket.io房间。目前,这些是我为确保用户最终进入私人房间所采取的步骤,现在我需要确保用户在加入之前获得身份验证。

  1. 客户端通过调用socket.io并传递他想要加入的房间来连接到我的io.connect服务器。
  2. 客户将订阅该房间并等待发出消息。
  3. socket_write向我的服务器发送一个json_encoded对象,该对象包含一个数据属性以及将该数据发送到的房间。
  4. 我的服务器通过socket.on接收数据,并将数据发送到客户端正在侦听的给定房间。
  5. 客户只会收到适合他的正确信息。
  6. 我的客户代码:

    var socket = io.connect('http://localhost:8000');
    socket.on('connect', function() {
       socket.emit('room', window.location.href);
    });
    

    服务器:

    const server = net.createServer((socket) => {
        // The event that fires on PHP's socket_write.
        socket.on('data', (msg) => {
            const data = JSON.parse(msg);
    
            io.sockets.in(data.room).emit('log', data.html.toString().trim());
        });
    }).listen(5600);
    

    我服务器的on连接事件:

    io.on('connection', function (socket) {
        // A client will trigger this event and pass their window.location.href(room) as room identifier.
        socket.on('room', function(room) {
            socket.join(room);
        });
    });
    

    我如何写入socket.io服务器:

    $data = [
        'html' => 'test',
        'room' => 'http://app.dev/stephan-v/app-test'
    ];
    
    $json = json_encode($data);
    
    socket_write($this->socket, $json, strlen($json));
    

    这是我对私有websocket消息的实现,但当然这不安全。如果有人知道这个房间的名字,那个人就可以轻松收听发出的消息。

    由于socket.join只能在我的服务器上进行,我想当时认证的唯一地方是?

    因此,我想我也应该传递数据来验证用户,而不是简单地传递房间。那时从我的node服务器发出一个AJAX请求到我的PHP后端?

    显然我不想通过网络发送普通密码和用户名,所以我一直在阅读JSON网络令牌。我想你需要:

    1. 在连接点将JWT发送到node服务器(以及我正在加入的加入空间)。
    2. 通过身份验证路径向我的node.js服务器发出AJAX请求到我的PHP后端。
    3. 如果该用户通过身份验证,则只允许用户加入会议室。
    4. 很抱歉很长的帖子但是这里涉及很多组件,所以我希望有人可以确认这个工作流程,也许会给我一些提示/指示。

      我宁愿不安装像Redis这样的东西,因为虽然它是前端/后端之间的一个很好的桥梁,但现在感觉像是矫枉过正,我想在更基本的层面上理解这一点。

0 个答案:

没有答案