Я использую экспресс-фреймворк. Я хочу получить данные сеанса из 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
});
});
Ответы:
Это не сработает для сокетов, проходящих через транспорт flashsocket (он не отправляет серверу необходимые файлы cookie), но надежно работает для всего остального. Я просто отключаю транспорт flashsocket в своем коде.
Чтобы заставить его работать, на стороне экспресс / подключения я явно определяю хранилище сеансов, поэтому я могу использовать его внутри сокета:
Затем в свой код сокета я включаю структуру подключения, чтобы я мог использовать ее синтаксический анализ файлов cookie для получения connect.sid из файлов cookie. Затем я ищу сеанс в хранилище сеансов, в котором есть этот connect.sid, например:
Затем вы можете использовать сеанс по мере необходимости.
источник
Решение модуля Socket.IO-sessions подвергает приложение XSS-атакам, раскрывая идентификатор сеанса на уровне клиента (сценария).
Вместо этого проверьте это решение (для Socket.IO> = v0.7). См. Документы здесь .
источник
socket.io
- это то, что выставляет идентификатор сеанса, а не этот модуль. Это не имеет большого значения, поскольку идентификатор сеанса в любом случае хранится на стороне клиента в файле cookie ... Кроме того, это руководство не работает для последней версии Express.socket.io
страницу github ..?Я предлагаю не изобретать велосипед полностью. Инструменты, которые вам нужны, уже являются пакетом npm. Думаю, это то, что вам нужно: session.socket.io Я использую его сейчас, и я думаю, это будет очень полезно !! Связывание экспресс-сессии со слоем socket.io даст множество преимуществ!
источник
Изменить: попробовав некоторые модули, которые не работали, я фактически пошел и написал свою собственную библиотеку для этого. Бесстыдный плагин: проверьте его на https://github.com/aviddiviner/Socket.IO-sessions . Я оставлю свой старый пост ниже в исторических целях:
Я получил эту работу довольно аккуратно, не обходя транспорт flashsocket в соответствии с решением pr0zac выше. Я также использую экспресс с Socket.IO. Вот как.
Сначала передайте в представление идентификатор сеанса:
Затем, на ваш взгляд, свяжите его с клиентской стороной Socket.IO:
Затем в вашем серверном слушателе Socket.IO возьмите его и прочитайте / запишите данные сеанса:
В моем случае
session_store
это Redis, использующийredis-connect
библиотеку.Надеюсь, это поможет кому-то, кто найдет этот пост во время поиска в Google (как и я;)
источник
См. Это: Аутентификация Socket.IO
Я бы посоветовал ничего не получать через
client.request...
или,client.listener...
поскольку это не связано напрямую сclient
объектом и всегда указывает на последнего зарегистрированного пользователя!источник
Проверьте Socket.IO-connect
Подключите WebSocket Middleware Wrapper вокруг Socket.IO-узла https://github.com/bnoguchi/Socket.IO-connect
Это позволит вам протолкнуть запросы Socket.IO вниз по стеку промежуточного программного обеспечения Express / Connect, прежде чем обрабатывать их обработчиками событий Socket.IO, предоставляя вам доступ к сеансу, файлам cookie и многому другому. Хотя я не уверен, что он работает со всеми транспортами Socket.IO.
источник
Вы можете использовать express-socket.io-session .
Поделитесь промежуточным программным обеспечением экспресс-сеанса на основе файлов cookie с socket.io. Работает с express> 4.0.0 и socket.io> 1.0.0 и не будет обратно совместимой.
Сработало у меня !!
источник
Вы можете посмотреть на это: https://github.com/bmeck/session-web-sockets
или, в качестве альтернативы, вы можете использовать:
Надеюсь это поможет.
источник
Я не уверен, что делаю это правильно. https://github.com/LearnBoost/socket.io/wiki/Authorizing
С данными рукопожатия вы можете получить доступ к файлам cookie. А в файлах cookie вы можете получить connect.sid, который является идентификатором сеанса для каждого клиента. А затем используйте connect.sid для получения данных сеанса из базы данных (я предполагаю, что вы используете RedisStore)
источник