Codeigniter在nodejs中读取会话cookie

Posted

技术标签:

【中文标题】Codeigniter在nodejs中读取会话cookie【英文标题】:Codeigniter read session cookie in nodejs 【发布时间】:2012-01-11 03:37:55 【问题描述】:

我正在使用 codeigniter 制作应用程序,并为实时内容实现 nodejs。我想检查用户是否使用 nodejs 登录。使用下面的代码,我可以在 nodejs 服务器中获取 codeigniter 会话 ID:

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'

如何解密会话 id 并检查是否从数据库中获得匹配项?

提前致谢

乔治

【问题讨论】:

【参考方案1】:

要使用 node.js 解密 cookie,我认为最简单的方法是通过命令行直接调用您的 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);

【讨论】:

感谢您的回答 :) 有没有办法让函数“解密”私有? 原来你不能通过cli调用私有函数。除了 nodejs 调用之外,还有其他方法可以拒绝对该函数的访问吗? 发现你可以用codeigniters is_cli_request()***.com/questions/8362946/…做到这一点【参考方案2】:

要添加到 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;

【讨论】:

以上是关于Codeigniter在nodejs中读取会话cookie的主要内容,如果未能解决你的问题,请参考以下文章

nodejs / express中的数据库会话支持[关闭]

Codeigniter 从 Session 读取值或从 URL 参数读取值哪个更快? [关闭]

在 Node JS 中从不同的“会话”读取/写入相同的文件内容是不是有风险?

如何在 Codeigniter 中检查是不是设置了会话?

PHP:在视图中显示会话变量:CodeIgniter

我应该在 CodeIgniter 中使用哪个会话库?