Codeigniter считывает сессионный cookie в nodejs - PullRequest
7 голосов
/ 02 декабря 2011

Я делаю приложение с codeigniter и внедряю nodejs для вещей в реальном времени.Я хочу проверить, вошел ли пользователь с помощью nodejs.С помощью приведенного ниже кода я могу получить идентификатор сеанса codeigniter на сервере nodejs:

var server = require('https').createServer(options, function(request, response){
var cookies=(function(str){
    var result={};
    str.split(/;\s+/).forEach(function(e){
        var parts=e.split(/=/,2);
        result[parts[0]]=parts[1]||'';
    });
    return result;
})(request.headers.cookie),
    sessionCookieName='ci_session',
    sessionId=cookies[sessionCookieName]||'';
    console.log(sessionId);
}).listen(8080);

Сеанс codeigniter хранится в базе данных, и для шифрования установлено значение true.И sess_match_ip = TRUE, sess_match_useragent = TRUE;

Теперь мой вопрос: как можно проверить, вошел ли пользователь в систему?Я установил клиент node-mysql.Я знаю, что CI делает что-то вроде:

SELECT *
FROM (`ci_sessions`)
WHERE `session_id` =  'blabla'
AND `ip_address` =  '127.0.0.1'
AND `user_agent` =  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.2   
(KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2'

Как мне расшифровать идентификатор сеанса и проверить, получаю ли я совпадение с БД?

Заранее спасибо

Джордж

Ответы [ 2 ]

6 голосов
/ 02 декабря 2011

Чтобы расшифровать cookie с помощью node.js, я думаю, что самый простой способ - это напрямую вызвать приложение CodeIgniter через командную строку.Поэтому создайте контроллер с функцией расшифровки (например):

class Welcome extends CI_Controller
{
    public function decrypt($toDescrypt)
    {
        $this->load->library('encrypt');
        $toDescrypt = urldecode($toDescrypt);
        echo $this->encrypt->decode($toDescrypt);
    }
}

И в файле node.js:

var exec = require('child_process').exec;
var mysql = require('mysql');
var client = mysql.createClient({
    user: 'root',
    password: ''
});

var server = require('http').createServer(function(request, response){
    var cookies=(function(str){
        var result={};
        str.split(/;\s+/).forEach(function(e){
            var parts=e.split(/=/,2);
            result[parts[0]]=parts[1]||'';
        });
        return result;
    })(request.headers.cookie),
    sessionCookieName='ci_session',
    sessionId=cookies[sessionCookieName]||'';

    //Execute the PHP code which will decrypt your sessionId and then you can use it to make your request
    var result = exec('php index.php welcome decrypt ' + sessionId, function(error, stdout, stderr) {
        var parts = stdout.split(';')
        var session_id = parts[1].split(':')[2];
        var ip_address = parts[3].split(':')[2];
        var user_agent = parts[5].split(':')[2] + ';' + parts[6] + ';' + parts[7];
        var query = 'select * from ci_sessions where session_id=' + session_id +
                ' and ip_address=' + ip_address + ' and user_agent=' + user_agent;

        client.query('use test');
        client.query(query, function(err, results, fields) {
            console.log(results[0].user_data);

            client.end();
        });
    });
}).listen(8080);
0 голосов
/ 08 июля 2013

Чтобы добавить к ответу TrexXx, я обнаружил, что использование расширения php-unserialize (npm install php-unserialize) обеспечивает лучшее взаимодействие между браузерами. Запрос получит результаты от несериализованного объекта, который намного надежнее:

var leSessionObj = require('php-unserialize').unserialize(sessionId);

Тогда

var query = 'select * from ci_sessions where session_id=' + leSessionObj.session_id +
        ' and ip_address=' + leSessionObj.ip_address + ' and user_agent=' + leSessionObj.user_agent;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...