Вопрос по node.js, websocket, express – Как я могу получить (Express) sessionID для подключения к веб-сокету

16

Я использую WebSocketsnpm install ws на том же порту, что и Экспресс.

Я хотел бы подобрать связанный с ним "sessionID". из HTTP-соединения, которое только что было установлено и обновлено до WebSocket.

// 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 на странице, но это ужасно.)

Ваш Ответ

2   ответа
5

наконец-то он заработал, используя подписанные куки-файлы!

Настройте свой магазин (пример хранилища памяти):

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

Представьте parseCookie как глобальный (если он вам нужен в других модулях), например, в js-файлах app / server:

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 в настоящее время является кошмаром. во всей информации ОЧЕНЬ НЕСКОЛЬКО существенных вещей .. везде нет объяснений, все воспринимается как должное.
Я нахожу, что это все еще лучше, чем php, и, поскольку я делаю много проектов на переднем и заднем плане, общий язык для меня намного лучше.
@vsync L2, веб-приложение, сэр.
14
Parse cookie Get session id

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');
});
Разве это печенье не будет подписано с секретом? Если это так, вам придется удалить подписанную часть, прежде чем использовать ее в качестве ключа для store.get.
Это на правильном пути, но там нет sid. печенье. Есть:connect.sid: n8Pbh5hPhNNC3B6PAkyuaRgv.o9wnmI3fiJ47kJMUfW0xVcMRkhjFkMbgvki/CTtemvU а такжеsessionid: 12d2b0c6f3c3eb661215a401d1942122, Какой из них является ключом к сеансу, а какой - другим? fadedbee
& APOS; connect.sid & APOS; является ключом по умолчанию для экспресс-cookie. В приведенном выше коде экспресс был сконфигурирован с использованием сеансового ключа «sid» ... если вы не настраиваете его, ключом является «connect.sid».
После долгих раздумий я получил вариант этой работы. Ключ должен был поставить секрет вexpress.cookieParser('123456') и использоватьupgradeReq.signedCookies['sid']
Ах, я виноват только в том, что вставил половину вашего кода. fadedbee

Похожие вопросы