How can I get (Express's) sessionID for a websocket connection

前端 未结 2 1976
温柔的废话
温柔的废话 2020-12-23 12:25

I\'m using WebSockets npm install ws on the same port as Express is running.

I\'d like to pick up the associated \'sessionID\' from the HTTP connection

相关标签:
2条回答
  • 2020-12-23 13:23
    1. Parse cookie
    2. Get session id
    3. Get session data

      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');
      });
      
    0 讨论(0)
  • 2020-12-23 13:26

    This was a nightmare, finally got it working for myself using signed cookies!

    Set up your store (example memory store):

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

    Expose parseCookie as global (if you need it in other modules) like this in app / server js files:

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

    Now set up sockets:

    //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
    
    0 讨论(0)
提交回复
热议问题