socket.io和session?

sfs*_*sfs 95 session node.js express

我正在使用快递框架.我想从socket.io访问会话数据.我尝试使用client.listener.server.dynamicViewHelpers数据表达dynamicHelpers,但我无法获取会话数据.有一个简单的方法吗?请参阅代码

app.listen(3000);

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

io.on('connection', function(client){
    // I want to use session data here
    client.on('message', function(message){
        // or here
    });
    client.on('disconnect', function(){
        // or here
    }); 
});
Run Code Online (Sandbox Code Playgroud)

小智 68

这不适用于通过flashsocket传输的套接字(它不会向服务器发送所需的cookie)但它可以可靠地用于其他所有事情.我只是在我的代码中禁用flashsocket传输.

为了使它工作,在快速/连接方面,我明确定义会话存储,以便我可以在套接字内使用它:

MemoryStore = require('connect/middleware/session/memory'),
var session_store = new MemoryStore();
app.configure(function () {
  app.use(express.session({ store: session_store }));
});
Run Code Online (Sandbox Code Playgroud)

然后在我的套接字代码中,我包含了连接框架,因此我可以使用它的cookie解析来从cookie中检索connect.sid.然后我在会话存储中查找具有connect.sid的会话,如下所示:

var connect = require('connect');
io.on('connection', function(socket_client) {
  var cookie_string = socket_client.request.headers.cookie;
  var parsed_cookies = connect.utils.parseCookie(cookie_string);
  var connect_sid = parsed_cookies['connect.sid'];
  if (connect_sid) {
    session_store.get(connect_sid, function (error, session) {
      //HOORAY NOW YOU'VE GOT THE SESSION OBJECT!!!!
    });
  }
});
Run Code Online (Sandbox Code Playgroud)

然后,您可以根据需要使用会话.

  • 要小心......现在有了新的约定...我建议使用Socket.IO身份验证.见@Jeffer的帖子 (6认同)
  • 看起来socket_client.request已在最新版本的socket.io-node中删除 (3认同)
  • 不幸的是,这不再适用 - parseCookie不再是connect utils的一部分.显然它从来不是公众api的一部分.有一个混乱的选择 - parseSignedCookie,但这也是私有的,所以我猜它也有消失的风险.. (2认同)

Jef*_*fer 34

Socket.IO-sessions模块解决方案通过在客户端(脚本)级别公开会话ID来使应用程序暴露于XSS攻击.

请改为检查此解决方案(对于Socket.IO> = v0.7).请参阅此处的文档.

  • -1 `socket.io` 是暴露会话 ID 的东西,而不是那个模块。这没什么大不了的,因为无论如何,会话 ID 都存储在客户端的 cookie 中……而且该教程不适用于最新版本的 Express。 (2认同)
  • 您的解决方案链接只是重定向到 `socket.io` github 页面..? (2认同)

Fra*_*sco 8

我建议不要完全重新发明轮子.你需要的工具已经是一个npm包.我认为这就是你需要的:session.socket.io 我这些天使用它,它会非常有用我想!将express-session链接到socket.io层将具有很多优势!

  • 这是一个更新的模块,支持socket.io> = 1.0的socket.io-express-sessions> = 1.0 https://github.com/xpepermint/socket.io-express-session (6认同)