Как я могу получить (Express's) sessionID для подключения к сети?
Я использую WebSockets npm 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');
});
Как это можно сделать?
(Я в настоящее время работаю над проблемой, отправив идентификатор сессии на странице, но это уродливо.)
Ответы
Ответ 1
- Parse cookie
- Получить идентификатор сеанса
-
Получить данные сеанса
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');
});
Ответ 2
Это был кошмар, наконец, он заработал для себя, используя подписанные файлы cookie!
Настройте свой магазин (пример хранилища данных):
var MemoryStore = express.session.MemoryStore;
store = new MemoryStore();
Expose parseCookie как глобальный (если вам это нужно в других модулях), как это в файлах app/server js:
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