如何获取(Express)的websID以进行websocket连接

fad*_*bee 16 websocket node.js express

我在npm install wsExpress正在运行的同一个端口上使用WebSockets .

我想从刚刚建立并升级到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');
});
Run Code Online (Sandbox Code Playgroud)

如何才能做到这一点?

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

ngu*_*kha 14

  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');
    });
    
    Run Code Online (Sandbox Code Playgroud)

  • 经过大量的摆弄,我得到了一个变化的工作.关键是将秘密放入`express.cookieParser('123456')`并使用`upgradeReq.signedCookies ['sid']` (3认同)

mat*_*yer 6

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

设置商店(示例内存存储):

var MemoryStore = express.session.MemoryStore;
store = new MemoryStore();
Run Code Online (Sandbox Code Playgroud)

在app/server js文件中将parseCookie公开为全局(如果你需要在其他模块中)

app.use(parseCookie = express.cookieParser('secret'));
Run Code Online (Sandbox Code Playgroud)

现在设置套接字:

//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
Run Code Online (Sandbox Code Playgroud)

  • 关于Node的一切都是当前的噩梦.所有的信息都缺乏很多必要的东西......到处都是解释,事情被认为是理所当然的. (5认同)