使用Socket.IO进行授权和握手

时间:2013-10-01 02:11:06

标签: javascript node.js sockets socket.io authorization

我想知道授权的主要功能和Socket.IO中的握手是什么。我已经在GitHub上阅读了他们的wiki和authorizing guide,但我仍然不理解以下内容:

  1. 授权如何在Socket.io中工作?
  2. Socket.IO中的握手是什么?
  3. 我可以向handshakeData对象添加任何内容吗?
  4. 我希望你能回答我的问题。感谢。

5 个答案:

答案 0 :(得分:59)

编辑:在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,然后可以识别匹配的会话。

答案 1 :(得分:10)

从Socket.io 1.0开始,尽管存在向后兼容性,但建议使用“io.use()”来添加ad-hoc中间件,因此在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)  });

答案 2 :(得分:2)

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

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);
});

答案 3 :(得分:0)

我知道为时已晚但我想在使用socket.io找到关于握手授权的非常好的文章的地方添加信息。

socket.io authorization

答案 4 :(得分:0)

在这种情况下

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

io.sockets.on('connection', function(socket) {
    console.log(socket.handshake.foo); // bar
});

socket.handshake.foo将给出未定义的

我们需要在此处调用 socket.request.foo 以获得适当的值

某人误导了我们,因为io auth中间件采用2个带有 PROPER NAMES的参数,如下所示(请求,回调)并非(握手,回调)PS:idk也许以前的io版本具有第二种情况:)< / p>

io.set('authorization', function (request, callback) {
    request.foo = 'bar';
    callback(null, true);
});