WebWost WebWostbeta

Совмещение PHP сессий с Socket.io

Используем сессии, созданные при помощи PHP, в Socket.io

Al-Sher

Всем привет! Сегодня я хочу поделиться небольшой надстройкой для работы с сессиями. Как и для чего это нужно? Ну думаю тут всё просто - совмещение авторизации на PHP и NodeJS(то есть модуля Socket.io). Как вообще работают сессии? У каждого пользователя, при запуске сессии(session_start) создается уникальный идентификатор, а так же свой собственный файл, куда записывается информация сессии. Сами сессии хранятся на сервере, но для определения какому пользователю принадлежит та или иная сессия(то есть файл сессий), используются различные способы, например куки.

PHP

Для начала настроим наш PHP-скрипт.

ini_set('session.save_path', FILEPATH);
session_name('session');
session_start();

Итак, тут мы указываем, что хранить сессии необходимо в FILEPATH, а так же называем куку, хранящую id сессии, session. Это облегчит работу на nodeJS ?

Socket.io

Для NodeJS нам понадобятся следующие модули:

socket.io
cookie

Я не стал включать в данный список модули, которые встроены в nodeJS изначально. Давайте подключим всё необходимое в наш index.js:

var io = require('socket.io')(3000);
var fs = require('fs');
var cookie = require('cookie');

Мы сразу отправляем socket.io слушать наш 3000 порт. Создадим простейший скрипт, возвращающий содержимое файлов сессии при подключении.

io.on('connection', function (client) {
    console.log('user connected: '+client.id);
    var cookies = cookie.parse(client.handshake.headers['cookie']);
    fs.readFile('FILEPATH/sess_'+cookies.session, "utf-8", function (err, data) {
        if(err) logger.error('session: '+err);
        client.emit('session', data);
    }
}

Данный код выведет всё содержимое файла пользователю, передав его как событие session.

Обработка сессий в NodeJS

К сожалению я не смог найти подходящей библиотеки/модуля для парсинга сессий, поэтому для обработки данных сессий мне придется изобрести велосипед ?

var sessions = data.split(';');
var session = Array();
for(var i = 0; i < sessions.length; i++)
{
    var temp = sessions[i].split(':');
    if(temp.length == 3) session[temp[0]] = temp[2];
    else session[temp[0]] = temp[1];
}

Таким образом на выходе мы должны получить массив session, где ключ - имя сессии, а его значение - значение сессии.

Заключение

На этом я заканчиваю данный пост, в надежде что всё расписано понятно ? Если вдруг Вы знаете подходящую для парсинга сессий библиотеку, буду рад выслушать

0 Комментариев

Новый комментарий