Socket.IO и сессия?
Вопрос
Я использую 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!!!!
});
}
});
Затем вы можете использовать сеанс по мере необходимости.
Другие советы
Я предлагаю не совсем изобретать колесо. Инструменты, которые вам нужны, уже есть пакет 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)