[英]Codeigniter read session cookie in nodejs
我正在用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);
將代碼點火器會話存儲在數據庫中,並將加密設置為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並檢查是否從數據庫中找到匹配項?
提前致謝
喬治
要使用node.js解密cookie,我認為最簡單的方法是通過comand行直接調用您的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);
為了增加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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.