socket.io и сессия? - PullRequest
       18

socket.io и сессия?

92 голосов
/ 09 января 2011

Я использую Express Framework.Я хочу получить данные сеанса из socket.io.Я попытался выразить dynamicHelpers с данными client.listener.server.dynamicViewHelpers, но я не могу получить данные сеанса.Есть ли простой способ сделать это?Пожалуйста, смотрите код

app.listen(3000);

var io = require('socket.io');
var io = io.listen(app);

io.on('connection', function(client){
    // I want to use session data here
    client.on('message', function(message){
        // or here
    });
    client.on('disconnect', function(){
        // or here
    }); 
});

Ответы [ 9 ]

69 голосов
/ 21 января 2011

Это не будет работать для сокетов, проходящих через транспорт flashsocket (он не отправляет серверу необходимые файлы cookie), но надежно работает для всего остального.Я просто отключаю транспорт flashsocket в своем коде.

Чтобы он работал, на стороне экспресс / подключения я явно определяю хранилище сеансов, чтобы использовать его внутри сокета:

MemoryStore = require('connect/middleware/session/memory'),
var session_store = new MemoryStore();
app.configure(function () {
  app.use(express.session({ store: session_store }));
});

Затем в коде моего сокета я включаю фреймворк connect, чтобы использовать его разбор файлов cookie для получения connect.sid из файлов cookie.Затем я просматриваю сеанс в хранилище сеансов, в котором есть этот connect.sid, примерно так:

var connect = require('connect');
io.on('connection', function(socket_client) {
  var cookie_string = socket_client.request.headers.cookie;
  var parsed_cookies = connect.utils.parseCookie(cookie_string);
  var connect_sid = parsed_cookies['connect.sid'];
  if (connect_sid) {
    session_store.get(connect_sid, function (error, session) {
      //HOORAY NOW YOU'VE GOT THE SESSION OBJECT!!!!
    });
  }
});

Затем вы можете использовать сеанс по мере необходимости.

34 голосов
/ 11 августа 2011

Решение модуля Socket.IO-session подвергает приложение атакам XSS, выставляя идентификатор сеанса на уровне клиента (сценариев).

Вместо этого проверьте это решение (для Socket.IO> = v0.7).Смотри документы здесь .

8 голосов
/ 15 января 2014

Предлагаю не изобретать велосипед заново. Инструменты, которые вам нужны, это уже пакет npm. Я думаю, это то, что вам нужно: session.socket.io Я использую это в эти дни, и это будет очень полезно, я думаю !! У связи экспресс-сессии со слоем socket.io будет много преимуществ!

4 голосов
/ 30 мая 2011

Редактировать: Попробовав несколько неработающих модулей, я на самом деле пошел и написал для этого свою собственную библиотеку. Бесстыдный плагин: посмотрите его на https://github.com/aviddiviner/Socket.IO-sessions. Я оставлю свой старый пост ниже для исторических целей:


Я получил эту работу довольно аккуратно, без необходимости обхода транспорта flashsocket в соответствии с решением pr0zac выше. Я также использую экспресс с Socket.IO. Вот как.

Сначала передайте идентификатор сеанса в представление:

app.get('/', function(req,res){
  res.render('index.ejs', {
    locals: { 
      connect_sid: req.sessionID
      // ...
    }
  });
});

Затем, на ваш взгляд, свяжите его с клиентской стороной Socket.IO:

<script>
  var sid = '<%= connect_sid %>';
  var socket = new io.Socket();
  socket.connect();
</script>
<input type="button" value="Ping" onclick="socket.send({sid:sid, msg:'ping'});"/>

Затем в своем прослушивателе Socket.IO на стороне сервера возьмите его и прочитайте / запишите данные сеанса:

var socket = io.listen(app);
socket.on('connection', function(client){
  client.on('message', function(message){
    session_store.get(message.sid, function(error, session){
      session.pings = session.pings + 1 || 1;
      client.send("You have made " + session.pings + " pings.");
      session_store.set(message.sid, session);  // Save the session
    });
  });
});

В моем случае session_store - это Redis, использующий библиотеку redis-connect.

var RedisStore = require('connect-redis');
var session_store = new RedisStore;
// ...
app.use(express.session({ store: session_store }));

Надеюсь, это поможет кому-то, кто найдет этот пост при поиске в Google (как я;)

3 голосов
/ 24 января 2011

См. Это: Аутентификация Socket.IO

Я бы посоветовал не извлекать что-либо через client.request... или client.listener..., так как это напрямую не связано с объектом client и всегдауказать последнего зарегистрированного пользователя!

2 голосов
/ 29 ноября 2017

Вы можете использовать express-socket.io-session .

Совместное использование промежуточного программного обеспечения для экспресс-сеансов на основе cookie с помощью socket.io. Работает с express> 4.0.0 и socket.io> 1.0.0 и не имеет обратной совместимости.

работал на меня !!

2 голосов
/ 05 сентября 2011

Оформить Socket.IO-connect

Подключить WebSocket Middleware Wrapper Around Socket.IO-узел https://github.com/bnoguchi/Socket.IO-connect

Это позволит вам выдвинуть Socket.IO-запросы передаются в стек промежуточного программного обеспечения Express / Connect, прежде чем обрабатывать его с помощью обработчиков событий Socket.IO, предоставляя вам доступ к сеансу, файлам cookie и многому другому.Хотя я не уверен, что он работает со всеми транспортными средствами Socket.IO.

1 голос
/ 12 января 2012

Я не уверен, что делаю все правильно. https://github.com/LearnBoost/socket.io/wiki/Authorizing

С данными рукопожатия, вы можете получить доступ к куки. А в cookie-файлах вы можете получить connect.sid, который является идентификатором сеанса для каждого клиента. А затем используйте connect.sid для получения данных сеанса из базы данных (я предполагаю, что вы используете RedisStore)

1 голос
/ 12 января 2011

Вы можете взглянуть на это: https://github.com/bmeck/session-web-sockets

или вы можете использовать:

io.on('connection', function(client) { 
  var session = client.listener.server.viewHelpers; 
  // use session here 
});

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...