[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Межсайтовая авторизация
Mihaz
Добрый день форумчане. Столкнуляч со следующей трудностью: Есть необходимость
реализовать авторизацию сразу на 3 ресурсах.
  • Личный кабинет (А2 биллинг)
  • Сайт
  • Форум.

Форум и сайт на одном хосте, с одной базой ,личный кабинет на другом(выделенный сервер).
Править код можно только Форума и Сайта. Кабинета нельзя. Надо чтобы человек вошедший на сайте, мог без повторной авторизации войти в свой личный кабинет и(или) на форум. Так же и другие варианты.
Тоже самое касаеться регистрации нового пользователя.
На счет регистрации тут вроде как все проще. Есть идея реализовать всего одну страницу для регистрации, линк на которую будет вести с любого из 3 ресурсов. После регистрации, рег.данные будут автоматически добалвенны в 3 таблицы( форума,сайта,кабинета).
Знаю, что велосипед изобритать не придеться, данные решения уже давно известны. Вот только мне они не до конца ясны. Если есть сведующие люди, просьба объяснить мне глупому,как это правильнее сделать. Желательно ничего не усложняя.
P.S. Использовать фрейм не годиться.




Спустя 1 час, 56 минут, 33 секунды (20.08.2010 - 09:17) Basili4 написал(а):
Mihaz
С Форумом сайтов все ясно и просто с кабинетом только CURL

Спустя 47 минут, 47 секунд (20.08.2010 - 10:05) Mihaz написал(а):
ЩАс пробую риализовать хранение сесси в БД, что то не получаеться ничего. Сам выдумывать не стал, нашел готовое решение:

<?

# Lockable MySQL sessions handler © Alex/AT

# using GET_LOCK and some black voodoo magic to store sessions in the
# MySQL database while keeping ability to serialize requests
# a must on clustered servers, does not utilize ATS SQL classes

# SCHEMA:
# CREATE TABLE `sessions` (
# `id` VARCHAR(255),
# `value` BLOB,
# `updated` TIMESTAMP,
# PRIMARY KEY (`id`),
# INDEX (`updated`)
# )


class MYSQL_SESSIONS
{
var $server; # MySQL server (optionally :port)
var $user; # MySQL user
var $password; # MySQL password
var $base; # MySQL database
var $table; # MySQL table to use
var $lockname = NULL; # named locks prefix, if NULL defaults to <base>.<table>

var $compress = TRUE; # compress database data? DO NOT CHANGE IN REALTIME!
var $compress_level = 9; # compression level

var $lock_retry_sleep = 1; # seconds to sleep in PHP before lock retry
var $lock_timeout = 10; # seconds to sleep in MySQL before lock retry
var $lock_fail_timeout = 60; # seconds to fail reading session if locked

var $dbid = NULL;

function MYSQL_SESSIONS()
{
}


# sets up and installs MySQL session handlers
function init()
{
if ($this->lockname === NULL)
$this->lockname = $this->base.'.'.$this->table;

session_set_save_handler(
array($this, '_open'),
array($this, '_close'),
array($this, '_read'),
array($this, '_write'),
array($this, '_destroy'),
array($this, '_gc')
);

}

function _open()
{
$this->dbid = mysql_connect($this->server, $this->user, $this->password, TRUE);
if (!$this->dbid) return(FALSE);
return(mysql_select_db($this->base, $this->dbid));
}

function _close()
{
if (!$this->dbid) return(FALSE);
mysql_close($this->dbid);
return(TRUE);
}

function _read($id)
{
if (!$this->dbid) die('Session failure: READ_NO_CONNECT');

# lock session
$this->_lock($id);

# perform the read
$res = mysql_query(
'SELECT * FROM '.
'`'.mysql_real_escape_string($this->table, $this->dbid).'`'.
' WHERE '.
'(`id` = "'.mysql_real_escape_string($id, $this->dbid).'")'
, $this->dbid);
if (!$res) die('Session failure: READ_NO_RESULT');
$row = mysql_fetch_assoc($res);
if (!is_array($row)) return('');

# done retrieving session data
return($this->compress ? gzuncompress($row['value']) : $row['value']);
}

function _write($id, $data)
{
if (!$this->dbid) die('Session failure: WRITE_NO_CONNECT');

# lock session
$this->_lock($id);

# write session
$res = mysql_query(
'REPLACE INTO '.
'`'.mysql_real_escape_string($this->table, $this->dbid).'`'.
' (`id`, `value`) VALUES ('.
'"'.mysql_real_escape_string($id, $this->dbid).'",'.
'"'.mysql_real_escape_string($this->compress ? gzcompress($data, $this->compress_level) : $data, $this->dbid).'"'.
')'
, $this->dbid);
if (!$res) die('Session failure: WRITE_NO_RESULT');

# done
return(TRUE);
}

function _destroy($id)
{
if (!$this->dbid) die('Session failure: DESTROY_NO_CONNECT');

# lock session
$this->_lock($id);

# perform the cleanup
$res = mysql_query(
'DELETE FROM '.
'`'.mysql_real_escape_string($this->table, $this->dbid).'`'.
' WHERE '.
'(`id` = "'.mysql_real_escape_string($id, $this->dbid).'")'
, $this->dbid);
if (!$res) die('Session failure: DESTROY_NO_RESULT');

# done retrieving session data
return(TRUE);
}

function _gc($lifetime)
{
if (!$this->dbid) die('Session failure: GC_NO_CONNECT');

# perform the read
$res = mysql_query(
'DELETE FROM '.
'`'.mysql_real_escape_string($this->table, $this->dbid).'`'.
' WHERE '.
'(`updated` < "'.mysql_real_escape_string(date('Y-m-d H:i:s', time() - $lifetime), $this->dbid).'")'
, $this->dbid);
if (!$res) die('Session failure: GC_NO_RESULT');

# done retrieving session data
return(TRUE);
}

function _lock($id)
{
# the most hard part: the locking itself
$time = 0;
$stime = time();
while (TRUE)
{
# try locking
$res = mysql_query(
'SELECT GET_LOCK('.
'"'.mysql_real_escape_string($this->lockname.'_'.$id, $this->dbid).'",'.
mysql_real_escape_string($this->lock_timeout, $this->dbid).
')'
, $this->dbid);
if (!$res) die('Session failure: LOCK_NO_RESULT');
$row = mysql_fetch_row($res);
if (!is_array($row)) die('Session failure: LOCK_NO_ROW');
if ($row[0] == 1) break; # succesfully obtained lock

# check, if we exceed the time

$etime = time();
if (($etime - $stime) > 0)
$time += $etime - $stime; # prevent some NTP crap up
if ($time > $this->lock_fail_timeout) die('Session failure: LOCK_TIMEOUT');
$stime = $etime;
sleep($this->lock_retry_sleep);
}

return(TRUE);
}

function _unlock($id)
{
$res = mysql_query(
'SELECT RELEASE_LOCK('.
'"'.mysql_real_escape_string($this->lockname.'_'.$id, $this->dbid).'"'.
')'
, $this->dbid);
if (!$res) die('Session failure: UNLOCK_NO_RESULT');
$row = mysql_fetch_row($res);
if (!is_array($row)) die('Session failure: UNLOCK_NO_ROW');

return(TRUE);
}
}


?>

А что там с CURL, можно поподробнее ?

Спустя 10 минут, 43 секунды (20.08.2010 - 10:15) Mihaz написал(а):
Цитата (Basili4 @ 20.08.2010 - 06:17)
Mihaz
С Форумом сайтов все ясно и просто с кабинетом только CURL


НА локале не получаеться получть доступ к сессионным переменным не через файлы, не через БД. Выходит я что то делаю не так. Как правильно отлавливать сессию на другом домене( для начала , если они на одном хосте)?

Спустя 10 месяцев, 13 дней, 23 часа, 41 минута, 39 секунд (4.07.2011 - 09:57) ИНСИ написал(а):
Цитата
Как правильно отлавливать сессию на другом домене

Погугли про: session_set_cookie_params и php_value session.cookie_domain

Спустя 2 часа, 35 минут, 14 секунд (4.07.2011 - 12:32) Nikitian написал(а):
Все эти 3 сайта на одном домене находятся? Имею ввиду домен второго уровня, например site.ru
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.