Перейти к публикации
Дизайн и модификация IPS Community IPBSkinsBETA
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
tolik777

Авторизация пользователей IPB на другом сайте

Рекомендованные сообщения

Итак есть форум на базе IPB 3.3.4 вида forum.site.com. И сейчас дописываем CMS для основного сайта site.com. И встала задача упрощенной регистрации/авторизации для зарегистрированных пользователей форума. Т.е. если у него есть эккаунт на форуме, то переходит на сайт, нажимает "вход" и заполняет дополнительные поля, которых нет в учетке форума, а имя/логин, мыло, остаются те же, что и на форуме.

Подскажите как такое лучше реализовать?

И может есть ссылки на мануалы или примеры, чтобы почитать?

Поделиться сообщением


Ссылка на сообщение
10/19/12 10:45 (изменено)

Сейчаз как раз сами такое начинаем делаем.

 

Создали на WEB-сервере директорию "/api" и положили туда файлик "get_user.php" с таким содержанием:

 

<?php 
header('Cache-Control: no-cache, must-revalidate');
header('Content-type: text/javascript; charset=utf-8');

define('DB_HOST',   'localhost', true);
define('DB_USER',   'xxx_forum', true);
define('DB_PASS',   '123456', true);
define('DB_NAME',   'xxx_forum', true);
define('TBLPREFIX',   'xxx_', true);

function ready($ka)
{
 $ka = strip_tags($ka);
 $ka = addslashes($ka);
 return $ka;
}

function dieERR($errcode, $errtxt = false)
{
 $s  = "\n"
      ."{\n"
      ."  \"response\": {\n"
      ."    \"errcode\": $errcode,\n";
 if ($errtxt) $s .= "    \"errmsg\": \"$errtxt\",\n";
 $s .= "  }\n";
 $s .= "}\n";  
 die($s);
 exit;
}

$uname = $_REQUEST['login'];
if (strlen($uname) < 3) die();

if (isset($_REQUEST['passhash'])) {
 $upass = strtolower($_REQUEST['passhash']);
 if (strlen($upass) != 32) dieERR(1002);
 $phash = TRUE;
} else {
 if (!isset($_REQUEST['password'])) die();
 $upass = $_REQUEST['password'];
 if (strlen($upass) < 3) dieERR(1002);
 $phash = FALSE;    
}

$uname = ready($uname);

$db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if ($db->connect_errno) dieERR(103, "Failed to connect to MySQL: (" . $db->connect_errno . ") " . $db->connect_error);

$res = $db->query('SELECT member_id, members_pass_salt, members_pass_hash 
                    FROM '.TBLPREFIX.'members 
                   WHERE members_l_username="'.$uname.'"');

if ($res->num_rows > 1) dieERR(4001);
if ($res->num_rows !== 1) dieERR(4000, $db->error);

$row = $res->fetch_array(MYSQLI_NUM);
$uid = $row[0];
if ($uid < 1) dieERR(1007);

if ($phash) {
 $passhash = md5(md5($row[1]) . $upass);
} else {
 $passhash = md5(md5($row[1]) . md5($upass));
}
if ($passhash !== $row[2]) dieERR(4002);


$res = $db->query('SELECT name, member_group_id, email, joined, last_visit, posts, last_post 
                    FROM '.TBLPREFIX.'members 
                   WHERE member_id='.$uid);

if ($res->num_rows !== 1) dieERR(4100, $db->error);
$row = $res->fetch_array(MYSQLI_ASSOC);

$s    = "\n"
      ."{\n"
      ."  \"response\": {\n"
      ."    \"errcode\": 0,\n"
      ."    \"member_id\": ".$uid.",\n"
      ."    \"group_id\": ".$row['member_group_id'].",\n"
      ."    \"name\": \"".$row['name']."\",\n"
      ."    \"email\": \"".$row['email']."\",\n"
      ."    \"joined\": ".$row['joined'].",\n"
      ."    \"last_visit\": ".$row['last_visit'].",\n"
      ."    \"posts\": ".$row['posts'].",\n"
      ."    \"last_post\": ".(is_null($row['last_post']) ? 0 : $row['last_post']).",\n";

$res = $db->query('SELECT field_5, field_6, field_11, field_12
                    FROM '.TBLPREFIX.'pfields_content 
                   WHERE member_id='.$uid);

if ($res->num_rows >= 1) {
 $row = $res->fetch_array(MYSQLI_ASSOC);       
 $s .= "    \"gender\": \"".$row['field_5']."\",\n"
      ."    \"location\": \"".$row['field_6']."\",\n"
      ."    \"mob_phone\": \"".$row['field_11']."\",\n" 
      ."    \"first_name\": \"".$row['field_12']."\",\n";
}

$s .=   "  }\n";
$s .=   "}\n";

echo $s;       

$db->close();

?>

 

 

Запросы к скрипту можно делать в двух вариантах:

1) get_user.php?login=<user>&password=<pass>

2) get_user.php?login=<user>&passhash=<md5>

 

Параметр passhash должен содержать md5 от пароля и представлен в виде HEX строки. Как раз этот passhash нужно хранить на "основном сайте site.com".

 

Первый вариант сделан чисто для теста. В дальнейшем планируем брать хеш от login, passhash, секретного кода и передавать полученный хеш в этом запросе.

Логин следует передавать в LOWER формате. Также логин лучше отдавать в Base64-URL формате (пока не реализовано).

 

Результат представлен в JSON виде и содержит пользователькие поля.

 

Вам как раз и нужно при нажатии кнопки "Вход" делать запрос к скрипту "get_user.php".

Изменено пользователем metos

Поделиться сообщением


Ссылка на сообщение

Как я понял сам скрипт никаких готовых API не предлагает? Т.е. сами сделали скрипт с подключением БД форума и вытаскиваем всю необходимую инфу, а потом отдаем ее скрипту для авторизации?

Поделиться сообщением


Ссылка на сообщение

Верно.

Поделиться сообщением


Ссылка на сообщение

Как я понял сам скрипт никаких готовых API не предлагает?

Что такое готовое API? На форуме есть API.

 

Или нужен готовый прмер, типа такого - http://ipbskins.ru/forum/topic6401.html/page__view__findpost__p__42015

 

 

Т.е. сами сделали скрипт с подключением БД форума

Разработчики форума не рекомендуют работать через базу.

Поделиться сообщением


Ссылка на сообщение
10/19/12 16:00 (изменено)

Разработчики форума не рекомендуют работать через базу.

Эта рекомендация актуальна для случаев, в которых производится не только чтение, а ещё и запись/update.

А так, этот скрипт быстрее отработает, чем IPB'шный мега навороченный класс DB.

Изменено пользователем metos

Поделиться сообщением


Ссылка на сообщение

та рекомендация актуальна для случаев, в которых производится не только чтение, а ещё и запись/update.

Для всех случаев.

И для совместимости. Сохранение структуры базы данных не кто не гарантирует.

Поделиться сообщением


Ссылка на сообщение

@metos, а чем не нравится функция json_encode? Я конечно понимаю, что у нее проблемы с кириллицей в windows-1251, но ведь тут все равно данные в utf-8, да и при желании можно написать небольшой костыль для фикса.

Потом, зачем два отдельных запроса, когда можно юзать один с JOIN-нами?

Использовать при фетчинге результата числовой массив вместо ассоциативного, могут только извращенцы.

 

Имхо, код уныл и сильно сыроват.

 

PS

О, ph-a, с возвращением на форум. :)

Поделиться сообщением


Ссылка на сообщение

Да еще и не абстрактен. Сей класс один раз положил - и пользуйся сколько угодно. При этом он работает в реальном времени - не надо никакие логины и пароли - если пользователь авторизован на форуме - он автоматически авторизован и на вашем сайте. Можете на сайте вообще регистрацию отключить за ненадобностью. При этом форум можно спокойно обновлять, переносить и т.д. - пока форум жив - связка жива. А всякие велосипеды, особенно с забитыми прямо в код паролями/логинами - тот еще говнокод.

Поделиться сообщением


Ссылка на сообщение

О, ph-a, с возвращением на форум

Спасибо. Были гигантские планы на лето. И нечего не сделал.

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

×
×
  • Создать...