интеграция codeigniter nodejs и nowjs - PullRequest
3 голосов
/ 03 декабря 2011

Я пытаюсь интегрировать 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:

РЕДАКТИРОВАТЬ : * Немного упростил его и получил сессионный cookie от клиента 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:

<?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 с идентификатором session_id, но с пустыми user_data, user_agent и ip 0.0.0.0. Одна строка каждый раз при отправке формы.

Что вызывает это и как я могу это исправить?

Я знаю, что есть проблема с сеансами ajaxcalls и codeigniter. Смотрите эту тему:

Есть ли способ узнать, был ли запрос сделан с помощью веб-сокетов?

2) Как лучше всего проверить, вошел ли пользователь в систему? например, оператор if, в котором вы проверяете, возвращал ли запрос что-нибудь или есть лучший метод?

3) Есть ли лучший способ сделать это?

Любая помощь оценена, так как я застрял на этом.

George

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

1 Ответ

2 голосов
/ 06 декабря 2011

Отличный вопрос, но много лишних, чтобы проверить ответ.

Мне кажется, что CLI не передает переменные окружения, такие как user_agent и ip. Они обрабатываются Apache и не имеют отношения к запросам CLI. Я бы выбрал только session_id, если вы знаете, что это безопасно в среде узла.

...