编辑: 在 Socket.IO 1.0 中,现在使用中间件。授权可以这样完成:
io.use(function(socket, next) {
var handshake = socket.request;
next();
});
如果您需要拒绝套接字,只需将错误对象传递给next() 回调。命名空间也可以做同样的事情:
io.of('/namespace').use(function(socket, next) {
var handshake = socket.request;
next();
});
Socket.IO 中的授权是通过一个函数运行的,该函数由回调传递的布尔值决定。每次连接尝试握手时都会运行此函数,如下所示:
io.set('authorization', function (handshake, callback) {
callback(null, true);
});
函数callback() 接受两个参数。第一个是错误原因(如果有),第二个参数是决定客户端是否可以连接的布尔值。默认情况下是没有授权的,所以场景如上面的代码示例所示,正在连接的套接字被允许通过true。
Socket.IO 中的握手与任何其他与信息技术相关的握手一样。这是协商的过程,在 Socket.IO 的情况下,它决定客户端是否可以连接,如果不能连接,则拒绝连接。握手是通过 XHR 或 JSONP 请求启动的,在未指定授权时不会做太多事情,但对 handshake 数据对象中传递的数据很有帮助。
要回答您的最后一个问题,是的,您可以在 handshake 对象中添加任何内容。该对象是对socket.handshake 对象的同一个变量引用,它允许您执行以下操作:
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,然后可以识别匹配的会话。