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