Перейти к публикации
View in the app

A better way to browse. Learn more.

Дизайн и модификация Invision Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Опубликовано:

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

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

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

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

Опубликовано:

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

 

Создали на 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

 

 

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

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

Опубликовано:

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

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

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

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

Опубликовано:

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

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

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

Опубликовано:

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

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

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

 

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

 

PS

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

Опубликовано:

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

Опубликовано:

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

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

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

Сейчас на странице 0

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.