【问题标题】:How can I get (Express's) sessionID for a websocket connection如何获取 websocket 连接的(Express)会话 ID
【发布时间】:2012-07-17 12:22:46
【问题描述】:

我在 Express 运行的同一端口上使用 WebSockets npm install ws

我想从刚刚建立并升级到 WebSocket 的 HTTP 连接中获取关联的“sessionID”。

// start express listening
server.listen(conf.server.port, conf.server.host);

var WebSocketServer = require('ws').Server
  , wss = new WebSocketServer({server: server});

wss.on('connection', function(ws) {
    var sessionID = // how do I get this?
    ws.on('message', function(message) {
        console.log('received: %s', message);
    });
    ws.send('something');
});

如何做到这一点?

(我目前通过在页面中发送 sessionID 来解决这个问题,但这很难看。)

【问题讨论】:

    标签: node.js websocket express


    【解决方案1】:
    1. 解析cookie
    2. 获取会话 ID
    3. 获取会话数据

      var express = require('express');
      var parseCookie = express.cookieParser();
      var MemoryStore = express.session.MemoryStore;
      
      var store = new MemoryStore();
      
      app.configure(function() {
          app.use(express.session({ store: store, secret: '123456', key: 'sid' }));
      });
      
      wss.on('connection', function(ws) {
          parseCookie(ws.upgradeReq, null, function(err) {
              var sessionID = ws.upgradeReq.cookies['sid'];
              store.get(sessionID, function(err, session) {
                  // session
              });
          }); 
      
          ws.on('message', function(message) {
              console.log('received: %s', message);
          });
          ws.send('something');
      });
      

    【讨论】:

    • 这是在正确的轨道上,但没有“sid”cookie。有:connect.sid: n8Pbh5hPhNNC3B6PAkyuaRgv.o9wnmI3fiJ47kJMUfW0xVcMRkhjFkMbgvki/CTtemvUsessionid: 12d2b0c6f3c3eb661215a401d1942122。其中哪一个是会话的关键,另一个是什么?
    • 'connect.sid' 是 express cookie 的默认键。在上面的代码中,配置了会话密钥是'sid'...如果你不自定义它,密钥是'connect.sid'。
    • 该cookie不会用秘密签名吗?如果是这样,您必须先删除签名部分,然后再将其用作 store.get 的密钥
    • 经过大量的摆弄,我得到了这个工作的变体。关键是将秘密放入express.cookieParser('123456')并使用upgradeReq.signedCookies['sid']
    • 我合成了 cmets 并包含了一个新的代码示例,见下文!
    【解决方案2】:

    这是一场噩梦,终于使用签名的 cookie 为自己工作了!

    设置您的存储(示例内存存储):

    var MemoryStore = express.session.MemoryStore;
    store = new MemoryStore();
    

    在应用程序/服务器 js 文件中像这样将 parseCookie 公开为全局(如果您在其他模块中需要它):

    app.use(parseCookie = express.cookieParser('secret'));
    

    现在设置套接字:

    //this method gets called later
    var ensureAuthenticatedSocket = function(handshake, callback) {
        cookie = cookieParser(handshake, null, function(err) {
            var sessionID = handshake.signedCookies['sid'];
            store.get(sessionID, function(err, session) {
                callback(err, session);
            });
        });
    };
    //listen time
    io = io.listen(server);
    //configure authentication
    io.configure(function() {
        io.set('authorization', function(handshake, callback) {
            //call the method with handshake as parameter, wait for callback
            ensureAuthenticatedSocket(handshake, function(err, session) {
                if (!err && session) {
                    //no error + found session = wicked!
                    callback(null, true);
                } else {
                    callback(null, false);
                }
            });
        });
    });
    ...
    //more socket code
    

    【讨论】:

    • 目前关于 Node 的一切都是一场噩梦。所有的信息都缺少这么多重要的东西……到处都缺乏解释,事情被认为是理所当然的。
    • @vsync L2 网络应用先生。
    • 我发现它仍然比 php 好,因为我做了很多前端和后端项目,所以通用语言对我来说要好得多。
    猜你喜欢
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 2019-02-20
    • 2012-05-15
    相关资源
    最近更新 更多