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服务器代码:

编辑:*稍微简化一下,并从客户端 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 函数。

我对此有三个问题:

1) 在 sc_sessions db 表中插入了一些行,其 session_id 为空,但 user_data、user_agent 和 ip 为 0.0.0.0。每次提交表单时一行。

是什么原因造成的,我该如何解决?

我知道 ajaxcalls 和 codeigniter 会话存在问题。看到这个线程:

有没有办法查看请求是否是使用 websockets 发出的?

2)检查用户是否登录的最佳方法是什么?例如 if 语句,您可以在其中检查查询是否返回任何内容或是否有更好的方法?

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

1 回答 1

2

很好的问题,但是测试答案的开销很大。

我最好的猜测是 CLI 不会传递 user_agent 和 ip 等环境变量。这些由 apache 处理,与 CLI 请求本身无关。如果您知道它在节点环境中是安全的,我会单独使用 session_id。

于 2011-12-05T23:19:11.640 回答