2011-12-02 18 views
7

Estoy haciendo una aplicación con codeigniter, e implementando nodejs para cosas en tiempo real. Quiero verificar si un usuario ha iniciado sesión con nodejs. Con el código de abajo soy capaz de obtener el identificador de sesión en el servidor CodeIgniter nodejs:Codeigniter lee la cookie de sesión en 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); 

La sesión CodeIgniter se almacena en la base de datos y el cifrado se establece en true. Y sess_match_ip = TRUE, sess_match_useragent = TRUE;

Ahora mi pregunta es, ¿cuál es una buena manera de comprobar si el usuario ha iniciado sesión? He instalado el cliente node-mysql. Iknow que CI hace algo como:

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' 

¿Cómo descifrar el identificador de sesión y comprobar si consigo un partido de la db?

Gracias de antemano

George

Respuesta

6

Para descifrar la cookie con Node.js creo que la forma más sencilla es llamar directamente a su aplicación CodeIgniter través de la línea COMAND. Por lo tanto crear un controlador con una función de descifrado (por exemple):

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

Y en 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

Gracias por la respuesta :) ¿Hay una manera de hacer la función de "descifrar "¿privado? – georgesamper

+0

Resulta que no se puede llamar a una función privada a través del cli. ¿Hay alguna otra forma de denegar el acceso a esa función que no sea la llamada del nodo? – georgesamper

+2

Descubrió que puede hacer esto con 'codeigniters is_cli_request()' http://stackoverflow.com/questions/8362946/codeigniter-calling-private-function-on-cli – georgesamper

0

Para añadir a la respuesta TrexXx, he encontrado que el uso de la extensión PHP-unserialize (npm install php-unserialize), ofrece una mejor experiencia de navegador cruzado. La consulta sería obtener los resultados del objeto decodificado, lo cual es mucho más fiable:

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

Entonces

var query = 'select * from ci_sessions where session_id=' + leSessionObj.session_id + 
     ' and ip_address=' + leSessionObj.ip_address + ' and user_agent=' + leSessionObj.user_agent; 
Cuestiones relacionadas