使用Socket.IO授权和握手

我想知道授权和Socket.IO握手的主要function是什么。 我已经在GitHub上阅读过他们的wiki和授权指南 ,但是我仍然不明白以下内容:

  1. 授权如何在Socket.io中工作?
  2. 什么是Socket.IO握手?
  3. 我可以添加任何东西到handshakeData对象?

我希望你能回答我的问题。 谢谢。

编辑:在Socket.IO 1.0中,现在使用中间件。 授权可以这样完成:

 io.use(function(socket, next) { var handshake = socket.request; next(); }); 

如果您需要拒绝套接字,只需将错误对象传递给next()callback。 命名空间也可以做同样的事情:

 io.of('/namespace').use(function(socket, next) { var handshake = socket.request; next(); }); 

Socket.IO中的授权是通过一个由callback传递的布尔值决定的函数来运行的。 每次连接尝试握手时,都会运行这个函数,这就是它的样子:

 io.set('authorization', function (handshake, callback) { callback(null, true); }); 

函数callback()接受两个参数。 第一个是错误原因,如果有的话,第二个参数是决定客户端是否连接的布尔值。 默认情况下没有授权,所以在上面的代码示例中显示了场景,其中正在连接的套接字允许通过true

Socket.IO握手就像任何其他信息技术相关的握手。 这是一个谈判的过程,在Socket.IO的情况下,决定一个客户端是否可以连接,如果不是,拒绝连接。 握手以XHR或JSONP请求启动,在没有指定授权的情况下不会执行太多的操作,但对handshake数据对象中传递的数据有帮助。

要回答你的最后一个问题,是的,你可以添加任何东西到handshake对象中。 该对象是与socket.handshake对象相同的variables引用,它允许你做这样的事情:

 io.set('authorization', function (handshake, callback) { handshake.foo = 'bar'; callback(null, true); }); io.sockets.on('connection', function(socket) { console.log(socket.handshake.foo); // bar }); 

这是非常有用的,因为你可以存储基于套接字的属性。 Express框架的一个常见用法是,可以根据Socket.IO传递的cookie来识别会话ID,然后可以识别匹配的会话。

由于Socket.io 1.0,尽pipe有向后兼容性,为了添加您的ad-hoc中间件,build议使用“io.use()”,所以在Node Server端:

 io.use(function(socket, next){ var joinServerParameters = JSON.parse(socket.handshake.query.joinServerParameters); if (joinServerParameters.token == "xxx" ){ next(); } else { //next(new Error('Authentication error')); } return; }); 

而在客户端,要添加自己的属性到握手中,看起来像这样:

 var joinServerParameters = { token: "xxx" }; var socket = io.connect('url' , {query: 'joinServerParameters=' + JSON.stringify(joinServerParameters) }); 

现在我正在使用这个简单的方法:

 io.set('authorization', function (handshakeData, accept) { var domain = handshakeData.headers.referer.replace('http://','').replace('https://','').split(/[/?#]/)[0]; if('myDomain.com'==domain) accept(null, true); else return accept('Deny', false); }); 

我知道这太晚了,但我想添加信息,我发现很好的文章关于使用socket.io握手授权。

socket.io授权