2011-12-03 17 views
3

私はcodeigniterフレームワークでnodejsとnowjsを統合しようとしています。サイト全体を書き直す時間がないので、ユーザーがログインしているかどうかをチェックしたいと思います。私はion_authを使用しています。データベース内のセッション。codeigniter nodejsとnowjs integration

クライアントJS:

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

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

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

相続人nodejsサーバコード:

EDIT:* それは少し簡素化、およびクライアント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); 
      } 
     }); 
    }); 
}; 
それが働いていると私は、データベースにセッションからコンソールへのuser_dataをログに記録することができ、それが適切に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); 
    } 
} 

そして、ここではnodejsによって呼び出さコントローラです。

私はこれについて、3つの質問を持っている:

1)のsession_idではなく、空のuser_data、user_agentのとIP 0.0.0.0でsc_sessionsのDBテーブルに挿入された行があります。フォームが送信されるたびに1行。

これを引き起こしている原因は何ですか。どのように修正できますか?

私はajaxcallsとcodeigniterセッションに問題があることを知っています。このスレッドを参照してください:

要求がWebソケットで行われたかどうかを確認する方法はありますか?

2)ユーザーがログインしているかどうかを確認する最善の方法は何ですか?たとえば、クエリで何かが返されたかどうかを確認するステートメント、またはより良いメソッドがある場合は?

3)これを行うより良い方法はありますか?

私はこれに固執しているように助けていただきありがとうございます。

ジョージ

EDIT: コマンドラインからスクリプトを呼び出すには、それが新しいセッションを作成していました。セッションクラスを拡張することでそれを防ぐ。

アプリケーション/ライブラリ/ 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

@スティーブンは、CIフォーラムにジョージBACKを指示する必要はありませんので、非常にCI/PHP/etcの質問に良いです! – Jakub

答えて

2

グレート質問が、答えをテストするためのオーバーヘッドがたくさん。

CLIはuser_agentやipのような環境変数を渡しません。これらはApacheによって処理され、ネイティブにCLI要求には関係しません。ノード環境で安全であることがわかっている場合は、session_idだけで処理します。

+0

返事をありがとう。私は少しのコードで少し質問を更新しました。しかし、まだセッションテーブルに1つの行が挿入されます。その問題を取り除くことはできません!!さもなければ、それは必要に応じて動作します。 – georgesamper

+0

コントローラは依然としてCLI要求のセッションクラスをロードしていますか?私はあなたが自動ロードを賢明にする必要があると思います。CIはおそらくそれを自動的に無効にするとは思わないので... – landons

+0

コントローラがCLIから実行されているときにセッションクッキーを作成しないようにする方法はありますか?おそらく、セッションクラスを拡張します。質問はどこに設定されるのですか? – georgesamper