Вопрос

Я использую Express Framework. Я хочу достичь данных сеанса от Socket.io. Я попробовал Express 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
    }); 
});
Это было полезно?

Решение

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

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

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

Затем в моем коде сокета я включаю структуру CONNECT, чтобы я мог использовать его приготовление печенья для получения 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!!!!
    });
  }
});

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

Другие советы

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

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

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

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


Я получил эту работу вполне аккуратно без необходимости обойти flashsocket. транспортировка в соответствии с pr0zac.решение выше. Я также использую Express с 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 SOCKET.IO Sistener выберите его и прочитайте / Написать данные сеанса:

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-connect библиотека.

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

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

Видеть это: Socket.io аутентификация

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

Проверить Socket.io-Connect.

Подключите Websocket Middleware Workber вокруг Socket.IO-узлаhttps://github.com/bnoguchi/socket.io-connect.

Это позволит вам подтолкнуть Socket.io request (ы) с помощью стека Express / Connect Shardware перед обработкой его обработчиками событий Socket.io, предоставляя вам доступ к сеансу, файла cookie и многое другое. Хотя я не уверен, что это работает со всеми транспортами Socket.io.

Вы можете использовать Express-Socket.IO-сессия .

Разделите промежуточное программное обеспечение Express-Session на основе cookie с помощью Socket.io. Работает с Express> 4.0.0 и Socket.io> 1.0.0 и не будет обратно совместимым.

Работал для меня !!

Вы можете посмотреть на это: https://github.com/bmeck/session-web-sockets.

или в качестве альтернативы вы можете использовать:

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

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

Я не уверен, что я делаю это правильно.https://github.com/learnboost/socket.io/wiki/authorizing.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top