2011-12-02 83 views
7

我使用codeigniter製作了一個應用程序,並實現了實時東西的nodejs。我想檢查用戶是否使用nodejs登錄。隨着下面的代碼,我能夠得到笨會話ID在服務器的NodeJS:Codeigniter在nodejs中讀取會話cookie

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並檢查是否從數據庫獲得匹配?

在此先感謝

喬治

回答

6

解密用的node.js的餅乾,我認爲最簡單的方法就是直接調用通過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); 
+0

感謝您的回答:) 有沒有一種方法,使功能「解密「 私人的? – georgesamper

+0

原來你不能通過cli調用一個私有函數。除了nodejs調用之外,是否有其他方法可以拒絕對該函數的訪問? – georgesamper

+2

發現你可以用'codeigniters is_cli_request()'來實現這一點http://stackoverflow.com/questions/8362946/codeigniter-calling-private-function-on-cli – georgesamper

0

爲了增加TrexXx答案,我發現,使用PHP-反序列化擴展( npm安裝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;