2011-12-02 15 views
7

में सत्र कुकी पढ़ता है मैं कोडनिर्देशक के साथ एक ऐप बना रहा हूं, और रीयलटाइम सामान के लिए नोडज लागू कर रहा हूं। मैं यह जांचना चाहता हूं कि कोई उपयोगकर्ता नोडजेस के साथ लॉग इन है या नहीं। कोड के साथ नीचे मैं 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 सत्र डेटाबेस में संग्रहीत किया जाता है और एन्क्रिप्शन सही पर सेट किया जाता है। और sess_match_ip = TRUE, sess_match_useragent = TRUE;

अब मेरा सवाल यह है कि उपयोगकर्ता लॉग इन करने के लिए यह जांचने का एक अच्छा तरीका क्या है? मैंने नोड-माइस्क्ल क्लाइंट स्थापित किया है।

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 कैसे डिक्रिप्ट और अगर मैं db से एक मैच मिल जाँच करते हैं: iKnow सीआई कुछ की तरह है कि?

अग्रिम

जॉर्ज

उत्तर

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

बाहर निकलता है आप क्ली के माध्यम से एक निजी समारोह को कॉल नहीं कर सकते हैं। क्या नोडज कॉल के अलावा उस फ़ंक्शन तक पहुंच से इनकार करने का कोई अन्य तरीका है? – georgesamper

+2

पता चला कि आप इसे 'codeigniters is_cli_request()' के साथ कर सकते हैं http://stackoverflow.com/questions/8362946/codeigniter-calling-private-function-on-cli – georgesamper

0

TrexXx जवाब देने के लिए जोड़ने के लिए, मैं ने पाया है कि php-unserialize एक्सटेंशन का उपयोग कर (npm php-unserialize स्थापित करें), एक बेहतर क्रॉस ब्राउज़र अनुभव लाता है। क्वेरी unserialized वस्तु है, जो एक बहुत अधिक विश्वसनीय है से परिणाम प्राप्त होगा:

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;