3

nodejs と nowjs を codeigniter フレームワークに統合しようとしています。サイト全体を書き直す時間がないので、ユーザーがログインしているかどうかを確認したいと思います。ion_auth を使用しており、セッションを db に保存しています。

クライアント 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 からセッション Cookie を取得します*

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 によって呼び出されるコントローラーです。

<?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);
  }
}

それは機能しており、データベースのセッションからコンソールにuser_dataを記録でき、everyone.now.receiveMessage関数を適切に呼び出します。

これに関して 3 つの質問があります。

1) sc_sessions db テーブルに、session_id を持つ行が挿入されていますが、user_data、user_agent、および ip 0.0.0.0 は空です。フォームが送信されるたびに 1 行。

何が原因で、どうすれば修正できますか?

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

リクエストが WebSocket で行われたかどうかを確認する方法はありますか?

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

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();
    }  
}
4

1 に答える 1

2

素晴らしい質問ですが、答えをテストするには多くのオーバーヘッドがあります。

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

于 2011-12-05T23:19:11.640 に答える