将自定义数据与socket.io中的handshakeData一起发送?
所以我有一个应用程序运行节点js与socket.io作为后端和正常的JavaScript作为前端。 我的应用程序有一个login系统,目前只要客户端连接就发送它的login数据。
现在我认为login数据与handshakeData一起发送会更好,所以我可以直接让用户在连接时login(而不是在build立连接之后),当login数据无效时分别拒绝授权。
我想这是最好把我的额外的数据在handshakeData的头部分,所以任何想法我可以做到这一点? (如果可能的话,不必修改socket.io,但如果这是我能忍受的唯一方法)
正如下面的许多评论指出的那样,Socket.IO API在1.0
版本中发生了变化。 现在应该通过一个中间件function来完成身份validation,请参阅“身份validation差异”@ http://socket.io/docs/migrating-from-0-9/#authentication-differences 。 我将包括我的原始答案,因为旧文档似乎已经不存在了。
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')); });
Pre 1.0
您可以在第二个参数中传递一个查询:param,以在授权方法中的服务器上可用的客户端连接()。
我刚刚testing过。 在客户端我有:
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' }
现在在v1.0.0中已经改变了。 请参阅迁移文档
基本上,
io.set('authorization', function (handshakeData, callback) { // make sure the handshake data looks good callback(null, true); // error first, 'authorized' boolean second });
变成:
io.use(function(socket, next) { var handshakeData = socket.request; // make sure the handshake data looks good as before // if error do this: // next(new Error('not authorized'); // else just call next next(); });
对于socket.io v1.2.1使用这个:
io.use(function (socket, next) { var handshake = socket.handshake; console.log(handshake.query); next(); });
这是我的代码发送查询数据到nodejs和server.io服务器客户端。
var socket = io.connect(window.location.origin, { query: 'loggeduser=user1' }); io.sockets.on('connection', function (socket) { var endp = socket.manager.handshaken[socket.id].address; console.log("query... " + socket.manager.handshaken[socket.id].query.user); }
也许api已经改变了,但是我做了以下的事情来获得额外的信息给服务器。
// client io.connect('localhost:8080', { query: 'foo=bar', extra: 'extra'}); // server io.use(function(sock, next) { var handshakeData = sock.request; console.log('_query:', handshakeData._query); console.log('extra:', handshakeData.extra); next(); });
版画
_query: { foo: 'bar', EIO: '3', transport: 'polling', t: '1424932455409-0' } extra: undefined
如果有人知道如何通过不在查询参数中的握手从客户端获取数据到服务器,请让我知道。
更新我用这个语法稍后遇到问题
io.connect('localhost:8080?foo=bar');
是我目前使用的。
我发现一个小问题,看到.loggeduser
io.sockets.on('connection', function (socket) { var endp = socket.manager.handshaken[socket.id].address; console.log("query... " + socket.manager.handshaken[socket.id].query.loggeduser); // ↑ here }