Socket.io作为客户端进行身份验证

时间:2017-04-24 18:40:49

标签: node.js websocket socket.io

我创建了一个nodeJS脚本来自动化网站上的一些操作 - 这是我的!

为了更好地控制正在发生的事情,我想听一下网站socket.io流上的事件。

到目前为止在NODE中工作

  • 登录网站并接收其Cookie作为字符串以便进一步请求
  • 使用来自登录的cookie发送请求(执行实际操作)
  • 打开websocket连接并收听公共(!)事件

在NODE中无法使用

  • 读取仅发送给特定用户的“私人”事件(我)

我在点击此网站上的特定按钮时检查了Chrome中发生的XHR请求。发送此请求后,chrome上的websocket连接会发出有关我的操作状态的事件。当然,这些事件仅发送给执行此操作的用户。

在节点中执行完全相同的请求(使用来自网站登录的cookie)给出正确的响应(成功),但我之前打开的套接字流只显示一些公共事件 - 与我的行为无关。

如此处所示,它登录,显示网站的cookie,打开套接字流。然后它发送一个XHR POST请求,其中包含标题中显示的cookie。响应表示“成功”,但每秒弹出一次的socket.io事件只是公共事件(userCount)。

  

http://i.imgur.com/ZUrA2el.jpg

发送请求后,应该会弹出“step_calc”等事件,显示我的操作状态。

我的脚本

在收到网站的登录cookie后,我正在运行:

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

main()

function main() {

            var socket = io(socketURL, {});

            socket.on('connect', function () {
                setTimeout(function(){
                    performAction();                                // Send XHR to server
                    console.log(" > Sending XHR request...")
                }, 1500)
            });

            socket.on('step_calc', function (data) {               // Personal event about my action
                console.log(" >>> Event = step_calc: " + data)
            });

            socket.on('login_time', function (data) {               // Personal event being displayed every few seconds IF LOGGED IN (chrome)                    console.log(" >>> Event = step_calc: " + data)
            });

            socket.on('userCount', function (data) {                // Public event
                console.log(" >>> Event = userCount: " + data)
            });

            socket.on('disconnect', function () {
                console.log(" > [Disconnected]");
            });
}

连接到套接字后1500ms,它将发送XHR请求,该请求应该使服务器向套接字发出信息 - performAction()。

当我检查chrome控制台时:

  • step_calc 跟随成功的XHR请求(特定于帐户)

  • login_time 每2秒显示一次,但仅在我登录时(帐户特定)

  • userCount 一直在向所有人展示

我检查了socket.io-client的API指南,找到了有关socketID的信息。但它只是说,如何在连接到服务器后获得此ID ...

  

https://github.com/socketio/socket.io-client/blob/master/docs/API.md#socket

...是的......在打开网站时,chrome首先做的是向网站发送GET请求,其数据如下:

  

EIO = 3及运输=轮询& T公司= 1493058868222-0

响应包含某种“sid”。

  

{ “SID”: “g_mqoOS __________ BHB”, “升级”:[ “的WebSocket”], “pingInterval”:25000 “pingTimeout”:60000}

嗯......

  • 现在我收集了所有这些信息,我该如何使用它?

  • 如何将套接字连接“连接”到我从登录中获取的cookie(我用来向网站发送请求)?

我真的希望我的问题是可以理解的。感谢任何帮助,我已经花了很多时间试图让它自己工作。

非常感谢!

编辑:

我尝试在chrome中使用握手添加相同的Cookie。一个奇怪的是,当我打开网站(它似乎是握手)时它所做的第一个XHR已经包含一个名为“io”的cookie,然后由一个新的替换。如果我检查chrome控制台>应用程序> cookie,我根本看不到这个cookie。它从何而来?

左侧:Chrome上XHR选项卡下的请求 右侧:这将显示在Websocket选项卡

  

http://i.imgur.com/VkRouQf.jpg

  • 是这两个不同的请求还是以某种方式相同?

  • 这些信息是否有助于解决我的问题?

1 个答案:

答案 0 :(得分:0)

从我所看到的,您并未将会话cookie传递给socket.io-client构造函数,这可能意味着套接字连接未经过身份验证。

试试这个:

var socket = io(socketURL, {
  extraHeaders: {
    Cookie : '...'
  }
});

记录here