8

我想通过 node.js 和socket.io在 websockets 上进行会话处理,而不必使用 cookie 并避免 express.js,因为应该还有客户端不在浏览器环境中运行。有人已经这样做了,或者在概念证明方面有一些经验?

4

2 回答 2

3

在 socket.io 连接建立之前,有一个握手机制,默认情况下,所有正确传入的请求都成功握手。但是,有一种方法可以在握手期间获取套接字数据并根据您接受或拒绝传入连接请求的选择返回 true 或 false。这是来自 socket.io 文档的示例:

因为 handshakeData 是在授权之后存储的,所以您实际上可以从该对象中添加或删除数据。

var io = require('socket.io').listen(80);

io.configure(function (){
  io.set('authorization', function (handshakeData, callback) {
    // findDatabyip is an async example function
    findDatabyIP(handshakeData.address.address, function (err, data) {
      if (err) return callback(err);

      if (data.authorized) {
        handshakeData.foo = 'bar';
        for(var prop in data) handshakeData[prop] = data[prop];
        callback(null, true);
      } else {
        callback(null, false);
      }
    }) 
  });
});

回调函数的第一个参数是error,你可以在这里提供一个字符串,如果不设置为null,它会自动拒绝客户端。第二个参数是布尔值,你是否想接受传入的请求。

于 2012-12-04T10:23:07.540 回答
1

这应该会有所帮助,https://github.com/LearnBoost/socket.io/wiki/Authorizing

您可以使用handshakeData中可用的以下组合来跟踪所有会话变量并唯一标识用户

{
   headers: req.headers       // <Object> the headers of the request
 , time: (new Date) +''       // <String> date time of the connection
 , address: socket.address()  // <Object> remoteAddress and remotePort object
 , xdomain: !!headers.origin  // <Boolean> was it a cross domain request?
 , secure: socket.secure      // <Boolean> https connection
 , issued: +date              // <Number> EPOCH of when the handshake was created
 , url: request.url          // <String> the entrance path of the request
 , query: data.query          // <Object> the result of url.parse().query or a empty object
}

这个例子也可能有帮助,只是让您的非浏览器客户端以不同的方式提供信息:

SocketIO + MySQL 认证

于 2012-08-26T06:25:57.337 回答