一尘不染

在socket.io中发送自定义数据和握手数据?

node.js

所以我有一个应用程序,它运行着以Socket.io作为后端的节点js,以普通javascript作为前端的应用程序。我的应用程序有一个登录系统,当前该系统只是让客户端在连接后立即发送其登录数据。

现在,我认为将登录数据与handhakeData一起发送会更好,因此我可以直接让用户在连接时登录(而不是在建立连接之后),或者在登录数据无效时分别拒绝授权。

我认为最好将其他数据放在handshakeData的标头部分中,所以有什么想法可以做到这一点?(如果可能,不必修改socket.io,但是如果这是我可以使用的唯一方法)


阅读 440

收藏
2020-07-07

共1个答案

一尘不染

正如下面的许多评论所指出的那样,Socket.IO API在其1.0发行版中进行了更改。现在应该通过中间件功能进行身份验证,请参阅“身份验证差异” @
http://socket.io/docs/migrating-from-0-9/#authentication-
differences。对于旧文档似乎不见了的用户,我将为那些坚持<1.0的人提供原始答案。

1.0及更高版本:

客户端:

//The query member of the options object is passed to the server on connection and parsed as a CGI style Querystring.
var socket = io("http://127.0.0.1:3000/", { query: "foo=bar" });

服务器端:

io.use(function(socket, next){
    console.log("Query: ", socket.handshake.query);
    // return the result of next() to accept the connection.
    if (socket.handshake.query.foo == "bar") {
        return next();
    }
    // call next() with an Error if you need to reject the connection.
    next(new Error('Authentication error'));
});

前1.0版

您可以将查询:第二个参数中的param传递给客户端的connect(),该参数将在授权方法中在服务器上可用。

我一直在测试。在客户端上,我有:

var c = io.connect('http://127.0.0.1:3000/', { query: "foo=bar" });

在服务器上:

io.set('authorization', function (handshakeData, cb) {
    console.log('Auth: ', handshakeData.query);
    cb(null, true);
});

服务器上的输出如下所示:

:!node node_app/main.js
   info  - socket.io started
Auth:  { foo: 'bar', t: '1355859917678' }
2020-07-07