2011-12-03 3 views
3

나는 codeigniter 프레임 워크와 nodejs 및 nowjs를 통합하려고합니다. 사용자가 로그인했는지 확인하려는 전체 사이트를 다시 작성할 시간이 없으므로 ion_auth를 사용하고 있습니다. 세션 db.codeigniter nodejs 및 nowjs 통합

클라이언트 JS :

var session_id = $.cookie('sc_session'); 

$("form").submit(function() { 
    now.distributeMessage($("textarea").val(),session_id); 
}); 

now.receiveMessage = function(message){ 
    $("body").append("<br>" + message); 
}; 

을 heres nodejs 서버 코드 :

편집 : * 조금 단순화 및 클라이언트 JS *

에서 세션 쿠키를 얻을 수
everyone.now.distributeMessage = function(message,session_cookie) { 
    exec('php index.php user_session decrypt ' + encodeURIComponent(session_cookie), 
    function (error, stdout, stderr) { 
     var parts = stdout.split(';'); 
     var session_id = parts[1].split(':')[2]; 
     var query = 'select * from sc_sessions where session_id=' + session_id; 
     client.query(query, function (err, results, fields) { 
      if (results) { 
       everyone.now.receiveMessage(str); 
      } 
     }); 
    }); 
}; 

그리고 여기가 nodejs에 의해 호출 컨트롤러 : 그것은 작동하고 난 데이터베이스의 세션에서 콘솔에 _ 데이터를 기록 할 수 있고, 제대로 everyone.now.receiveMessage 함수를 호출

<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); 

class User_session extends CI_Controller 
{ 
    public function __construct() 
    { 
    parent::__construct(); 
    if (!$this->input->is_cli_request()) { 
     redirect('index'); 
    } 
    } 

    public function decrypt($session_id) 
    { 
    $this->load->library('encrypt'); 
    $session_id = urldecode($session_id); 
    echo $this->encrypt->decode($session_id); 
    } 
} 

.

나는이에 대한 세 가지 질문이 있습니다

1) SESSION_ID로하지만 빈 _ 데이터, USER_AGENT 및 IP 0.0.0.0로 sc_sessions의 DB 테이블에 삽입 된 행이 있습니다. 양식이 제출 될 때마다 한 행씩.

이 문제의 원인은 무엇이며 어떻게 수정합니까?

ajaxcalls 및 codeigniter 세션에 문제가 있음을 알고 있습니다. 이 스레드를보십시오 :

요청이 웹 소켓으로 만들어 졌는지 확인할 방법이 있습니까?

2) 사용자가 로그인했는지 확인하는 가장 좋은 방법은 무엇입니까? 예를 들어 where 문에서 쿼리가 무엇을 반환했는지 확인하거나 더 나은 방법이 있는지 확인하십시오.

3) 더 나은 방법이 있습니까?

나는 이것에 붙어있어 어떤 도움을 주셔서 감사합니다.

조지

편집 : 명령 행에서 스크립트를 호출은 새로운 세션을 생성하는 원인이되었다. 세션 클래스를 확장하여이를 방지하십시오.

응용 프로그램/라이브러리/MY_Session.php

<?php 
class MY_Session extends CI_Session { 

    public function __construct() 
    { 
     $CI = get_instance(); 

     if ($CI->input->is_cli_request()) 
     { 
      return; 
     } 

     parent::__construct(); 
    } 
} 
+0

CI 포럼에 대해 질문하는 것이 좋습니다. 저기서 더 좋은 대답을 얻을 수있는 기회는 10 배 더 낫습니다. – Steven

+0

감사합니다 – georgesamper

+1

@Steven, CI 포럼에 George BACK을 지시 할 필요가 없으므로 CI/PHP/etc 질문에 매우 좋습니다! – Jakub

답변

2

큰 문제지만, 대답을 테스트하는 오버 헤드를 많이.

CLI는 user_agent 및 ip와 같은 환경 변수를 전달하지 않습니다. 그것들은 아파치에 의해 처리되며, 기본적으로 CLI 요청과 관련이 없습니다. 노드 환경에서 안전하다는 것을 안다면 session_id 만 사용합니다.

+0

답장을 보내 주셔서 감사합니다. 적은 코드로 질문을 조금 업데이트했습니다. 그것은 여전히 ​​하나의 행을 세션 테이블에 삽입합니다. 그 문제를 없앨 수 없다 !! 그렇지 않으면 정상적으로 작동합니다. – georgesamper

+0

컨트롤러가 여전히 CLI 요청을위한 세션 클래스를로드합니까? 당신이 자동로드 기능에 대해 똑똑해 져야 할 것 같아요. CI가 아마도 자동으로 사용하지 않도록 생각하지 않기 때문입니다 ... – landons

+0

컨트롤러가 CLI에서 실행될 때 세션 쿠키를 만들지 못하게 할 수있는 방법이 있습니까? 아마도 세션 클래스를 확장하면됩니다. 질문은 어디에서 설정됩니까? – georgesamper