【问题标题】:Socket.io session without express.js?没有 express.js 的 Socket.io 会话?
【发布时间】:2012-08-20 19:23:21
【问题描述】:

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

【问题讨论】:

  • socket.io 的示例不使用 express,但我想你已经知道了。您还需要哪些额外信息?

标签: node.js session express websocket socket.io


【解决方案1】:

在socket.io连接建立之前,有一个握手机制,默认情况下,所有正确传入的请求都成功握手。但是,有一种方法可以在握手期间获取套接字数据并根据您接受或拒绝传入连接请求的选择返回真或假。这是来自 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);
      }
    }) 
  });
});

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

【讨论】:

    【解决方案2】:

    这应该会有帮助,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 Authentication

    【讨论】:

    • 好点,如果我可以在客户端的 req.headers 中添加一个 sessionid 并在授权时验证它。因此,我必须编写一个与 req 和 res 变量分离的独立会话处理程序。也许我可以使用连接会话作为代码库来与会话存储和其他东西兼容。您知道如何在客户端向标头添加值吗?一旦我的 websocket 连接被授权,它是否像一个单一的 http-request 一直验证他的会话一样安全?
    猜你喜欢
    • 2012-08-03
    • 2016-09-10
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 2012-06-25
    • 2014-12-23
    • 2013-02-12
    相关资源
    最近更新 更多