Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Socket.io作为客户端进行身份验证_Node.js_Websocket_Socket.io - Fatal编程技术网

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

Node.js Socket.io作为客户端进行身份验证,node.js,websocket,socket.io,Node.js,Websocket,Socket.io,我制作了一个nodeJS脚本来自动化一个网站上的一些操作-这不是我的 为了更好地控制正在发生的事情,我想听听网站socket.io流上的事件 目前在节点中工作: 登录网站并将cookie作为字符串接收,以便进一步请求 使用来自登录的cookies发送请求(执行实际操作) 打开websocket连接并收听公共(!)事件 在节点中还不起作用: 读取仅发送给特定用户(me)的“私有”事件 当我点击这个网站上的一个特定按钮时,我检查了chrome中发生的一个XHR请求。发送此请求后,chrome

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

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

目前在节点中工作

  • 登录网站并将cookie作为字符串接收,以便进一步请求
  • 使用来自登录的cookies发送请求(执行实际操作)
  • 打开websocket连接并收听公共(!)事件
在节点中还不起作用

  • 读取仅发送给特定用户(me)的“私有”事件
当我点击这个网站上的一个特定按钮时,我检查了chrome中发生的一个XHR请求。发送此请求后,chrome上的websocket连接将发出有关我的操作状态的事件。当然,这些事件仅发送给执行此操作的用户

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

如图所示,它登录、显示网站的cookies、打开套接字流。然后它发送一个XHR POST请求,并在标题中显示cookie。响应为“success”,但每秒弹出一次的socket.io事件只是公共事件(userCount)

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

我的剧本 在收到作为字符串的网站登录cookies后,我运行以下操作:

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]");
            });
}
连接到套接字1500毫秒后,它将发送XHR请求,该请求将使服务器向套接字发送信息-performAction()

当我检查chrome控制台时:

  • 步骤\u calc之后是成功的XHR请求(特定于帐户)

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

  • userCount一直都在向所有人显示

我查看了socket.io客户端的API指南,发现了关于socketID的信息。但它只是说,连接到服务器后如何获取该id

。。。是的。。。打开网站时,chrome做的第一件事就是向网站发送GET请求,数据如下:

EIO=3&传输=轮询&t=1493058868222-0

响应包含某种类型的“sid”

{“sid”:“g_mqoOS_______;bHb”,“升级”:[“websocket”],“pingInterval”:25000,“pingTimeout”:60000}

好。。。
  • 既然我已经收集了所有这些信息,我该如何使用它呢

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

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

非常感谢

编辑: 我试着在chrome中添加与握手相同的饼干。一件奇怪的事情是,当我打开网站时,它所做的第一个XHR(似乎是握手)已经包含一个名为“io”的cookie,然后被一个新的替换。如果我检查chrome控制台>应用程序>cookies,我根本看不到这个cookie。它来自哪里

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

  • 这两个请求是不同的,还是在某种程度上是相同的

  • 这些信息有助于解决我的问题吗


在我看来,您没有将会话cookie传递给
socket.io客户端
构造函数,这可能意味着socket连接没有经过身份验证

试试这个:

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

有文档记录。

从我所看到的,您没有将会话cookie传递给
socket.io客户端
构造函数,这可能意味着套接字连接没有经过身份验证

试试这个:

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

记录。

谢谢,我只是尝试通过这种方式从网站登录中传递cookies。它不会抛出错误,但也不会在套接字上显示任何特定于帐户的信息。我刚刚看到,打开网站时的请求似乎在返回新sid时“刷新”了一个“io”cookie。我真的很抱歉,我从未使用过socket.io,我不知道我需要发送哪些cookies。这就是在这个“io”请求期间cookies的情况:我想您应该发送服务器正在发送的任何cookies。不过,我不确定socket.io客户端本身在发送回特定cookie方面能做多少。可能不会太多,因为我登录网站得到的cookie不包括这个“io”cookie。Chrome肯定在后台做了些什么。你知道吗,如果我作为客户可以更改Sid?也许我必须重新创建用SID响应的请求,并执行类似socked的操作。id=response.Sid?套接字id是服务器创建的,我怀疑客户端是否可以更改它。至于cookies,您需要专门查找在
socket.io
握手协议(最初通过HTTP到
/socket.io/…
)期间发送和接收的cookies。Ahhh。那么你链接到我的额外标题中的cookie是用于我在chrome中看到的握手吗?因此,如果我设法发送相同的cookies集,这可能会起作用。我将尝试报告。非常感谢。谢谢,我只是尝试通过这种方式从网站登录传递cookies。它不会抛出错误,b