1. Приветствуем Вас на неофициальном форуме технической поддержки XenForo на русском языке. XenForo - коммерческий форумный движок от бывших создателей vBulletin, написанный на PHP.

Сторонняя авторизация через базу XF

Тема в разделе "Вопросы и ответы по XenForo Framework", создана пользователем snake007v, 13.10.2011.

Загрузка
  1. snake007v

    snake007v Местный

    Регистрация:
    22.01.11
    Сообщения:
    37
    Симпатии:
    25
    Версия XF:
    1.1.2
    Доброго времени суток! Нужно выполнить авторизацию пользователей через базу в стороннем скрипте. Например, на IPB это было:
    PHP:
    $auth_status mysql_query("select if(md5(concat(md5(members_pass_salt),md5('$passwd')))=members_pass_hash,1,0) status from ibf_members where name='$login'");
    А в XF я даже не нашел где эти пароли сохраняются =)
     
  2. Yoskaldyr

    Yoskaldyr Пользователь

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    самый правильный вариант - подключать ядро ксена, и тогда автоматическая проверка реги будет, если вручную, то слишком большой гемор :(
    Т.к. как ксен поддерживает абсолютно различные типы авторизаций (ксеновкая, вобловская, ipb), которые определяются своими классами и в результате каждый класс обрабатывает и хранит в базе данные по своему. К примеру у одного пользователя будет проверка пароля по ipb алгоритму, а у другого по vb алгоритму.
     
  3. snake007v

    snake007v Местный

    Регистрация:
    22.01.11
    Сообщения:
    37
    Симпатии:
    25
    Версия XF:
    1.1.2
    Может плохо сформировал задачу... Нужно чтоб скрипт some_stuff.php коннектился к базе xf, выгребал оттудова пас(и если нужно, производил с ним дополнительные манипуляции - добавление соли и т.п.), обрабатывал полученный ответ.
    Может не правильно понял ответ?
     
  4. Yoskaldyr

    Yoskaldyr Пользователь

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    Я понял что именно надо, только как я написал выше - у ксена не один алгоритм хранения контрольных сумм, а несколько. К тому же эти алгоритмы можно расширять пользовательскими классами. Т.е. у разных пользователей может разный алгоритм расчета хешей. Все это хранится xf_user_authenticate для внутренних служб проверки пароля и в xf_user_external_auth для внешних служб (facebook / twitter).
    Классы внутренних служб:
    XenForo_Authentication_Core (раньше XenForo_Authentication_Default) - стандартный метод xenforo для хранения пароля
    XenForo_Authentication_IPBoard - после конвертации с IPB
    XenForo_Authentication_NoPassword - может использоваться при использовании внешних служб (facebook/twitter), но не обязательно
    XenForo_Authentication_vBulletin - после конвертации с vB

    Вот почему не получится просто одним sql-запросом проверить валидность пользователя. Какие алгоритмы проверки хеша можно глянуть в этих файлах.
     
    snake007v нравится это.
  5. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Посмотрите таблицы user и authenticate. В последней хранится класс обработки и сам ключ (пасс).
     
  6. Yoskaldyr

    Yoskaldyr Пользователь

    Регистрация:
    27.09.10
    Сообщения:
    1 921
    Симпатии:
    1 163
    Версия XF:
    1.0.4
    точно забыл. Придется сначала получать id пользователя из xf_user а потом уже работать с этим Id в вышеописанных таблицах. Или сразу c join-ом делать запрос.

    P.S. Конечно можно сделать монстрозапрос с кучей подусловий для различных классов, но проще сначала получить запросом данные из базы, а потом в зависимости от используемого класса проверки хеша использовать соответствующий алгоритм.
     
    FractalizeR нравится это.
  7. snake007v

    snake007v Местный

    Регистрация:
    22.01.11
    Сообщения:
    37
    Симпатии:
    25
    Версия XF:
    1.1.2
    Спасибо за ответы, разобрался.
     
  8. NIc

    NIc Пользователь

    Регистрация:
    11.11.11
    Сообщения:
    16
    Симпатии:
    6
    $auth = new XenForo_Authentication_Core;

    $user_id = 1;

    $res = $db->fetchCol("select data from xf_user_authenticate where user_id=", $user_id);

    $auth->setData($res[0]);
    $is_valid = $auth->authenticate($user_id, $password);
     
    snake007v нравится это.
  9. snake007v

    snake007v Местный

    Регистрация:
    22.01.11
    Сообщения:
    37
    Симпатии:
    25
    Версия XF:
    1.1.2
    А какие файлы необходимо подключить?
     
  10. NIc

    NIc Пользователь

    Регистрация:
    11.11.11
    Сообщения:
    16
    Симпатии:
    6
    Там не надо ничего подключать, действует система автоподключения классов.
    вот весь код
    Код:
    $startTime = microtime(true);
     
    $fileDir = dirname(__FILE__);
     
    require($fileDir . '/library/XenForo/Autoloader.php');
     
    XenForo_Autoloader::getInstance()->setupAutoloader($fileDir . '/library');
     
    XenForo_Application::initialize($fileDir . '/library', $fileDir);
     
    XenForo_Application::set('page_start_time', $startTime);
     
    $db = XenForo_Application::get('db');
     
    if(isset($_GET['user']) && isset($_GET['pwd']))
     
    {
     
    $user = $_GET['user'];
     
    $pwd = $_GET['pwd'];
     
    $sql = "select user_id from xf_user where username=" . $db->quote($user);
     
    $res = $db->fetchCol($sql);
     
    if(!count($res))
     
    {
     
    print "Validation Error";
     
    return;
     
    }
     
    $user_id = $res[0];
     
    $auth = new XenForo_Authentication_Core;
     
    $sql = "select data from xf_user_authenticate where user_id=" . $user_id;
     
    $res = $db->fetchCol($sql);
     
    if(!count($res))
     
    {
     
    print "Validation Error";
     
    return;
     
    }
     
    $auth->setData($res[0]);
     
    $is_valid = $auth->authenticate($user_id, $pwd);
     
    if(!$is_valid)
     
    {
     
    print "Validation Error";
     
    return;
     
    }
     
    }
     
    else
     
    {
     
    print "Validation Error1";
     
    return;
     
    }
     
    GELMESHIK и snake007v нравится это.
  11. Nicolayka

    Nicolayka Местный

    Регистрация:
    25.02.12
    Сообщения:
    70
    Симпатии:
    13
    Версия XF:
    1.4.4
    А можно посмотреть скрипт с внедрённой в него проверкой из БД форума?
     
  12. megavolt

    megavolt Местный

    Регистрация:
    31.10.10
    Сообщения:
    80
    Симпатии:
    49
    А не проще ли вместо всей этой возни с БД использовать следующее:

    PHP:
    $userModel XenForo_Model::create('XenForo_Model_User');
    $xen_user $userModel->validateAuthentication($user$pwd);
     
    A1ex нравится это.
  13. GELMESHIK

    GELMESHIK Местный

    Регистрация:
    24.05.12
    Сообщения:
    21
    Симпатии:
    1
    Версия XF:
    1.1.2
    Спасибо!!! То, что надо!!

    А кто-нибудь подскажет, как можно авторизоваться на форуме, через "url" пример:
    /forum/index.php?login=mylogin&password=mypass
     
  14. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Через url не получится. Нужно использовать обязательно токены через POST и, если не ошибаюсь, еще потребуется использование кук.
     
  15. GELMESHIK

    GELMESHIK Местный

    Регистрация:
    24.05.12
    Сообщения:
    21
    Симпатии:
    1
    Версия XF:
    1.1.2
    А что, требуется дописать в index.php(к примеру), чтоб можно было авторизоваться через "url"?

    /forum/index.php?l=mylogin&p=mypass
    PHP:
    $user $_POST['l'];
    $pass $_ POST ['p'];
    ,,,,,,,
    А вот на счет куков, я не знаю.
     
  16. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Ну там несколько сложнее все. Т.е. после авторизации по адресу http://сайт/путь_до_форума_или_сразу/login/login, где нужно использовать метод POST, а не GET, устанавливается кук и в дальнейшем он используется как кук авторизации. При этом при отправке данных и кук должен быть и в POST затем должен присутствовать служебный токен, генерируемый в каждом запросе. Под отправкой данных понимается заполнение какой-либо формы и передача ее на сервер. Например, таким способом можно создать тему или пост, имитируя действия пользователя.
    Т.е. алгоритм следующий:
    1) запрашиваем с пустым POST-запросом (т.е. просто обычный запрос GET) страницу login/login (выше я давал ее ссылку), это даст нам кук;
    2) с использованием кука отправляем уже специально сформированный POST-запрос с логином и паролем по той же ссылке, что нам даст авторизацию, кук при этом сохраняется, но сервер теперь нас может узнать и позволит запрашивать другие страницы с учетом логина и пароля;
    3) можем теперь запрашивать нужные страницы с обязательным использованием кука (например, можем получить содержимое страницы с темой не для гостей, но доступной пользователю);
    4) если нужно большее (передать на сервер данные формы, например), то результат пункта 3 парсим на предмет поиска токена формы, а затем, используя этот токен, отправляем специальный POST-запрос на определенный url.

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

    В общем как-то так. Функциональный пример дать не могу, так как он очень для себя и очень узкоспециализированный. Алгоритм я описал. Использовал для этого расширение CURL для PHP. Писал я, естественно, на PHP. То же самое можно реализовать на любом другом языке с нужными библиотеками.
     
    GELMESHIK нравится это.
  17. ivankuraev

    ivankuraev Местный

    Регистрация:
    06.08.11
    Сообщения:
    45
    Симпатии:
    21
    делаем всё проще
    получаем сразу же всю информацию о пользователе в массив

    форму авторизации с сайта отправляем на скрипты xenforo

    PHP:
    define'XF_ROOT''путь до папки с xenforo' );
    define'TIMENOW'time( ) );
    define'SESSION_BYPASS'false );
     
    $is_logged false;
    $user_info = array( );
     
    require_once( 
    XF_ROOT '/library/XenForo/Autoloader.php' );
     
    XenForo_Autoloader::getInstance( )->setupAutoloaderXF_ROOT '/library' );
    XenForo_Application::initializeXF_ROOT '/library'XF_ROOT );
    XenForo_Application::set'page_start_time'TIMENOW );
    XenForo_Application::disablePhpErrorHandler( );
    XenForo_Application::setDebugModefalse );
     
    if( ! 
    SESSION_BYPASS )
    {
        
    XenForo_Session::startPublicSession( );
        
    $visitor XenForo_Visitor::getInstance( );
        if( 
    $visitor->getUserId( ) )
        {
            
    $userModel XenForo_Model::create'XenForo_Model_User' );
            
    $user_info $userModel->getFullUserById$visitor->getUserId( ) );
     
            
    $user_info['logout_link'] = XenForo_Link::buildPublicLink"canonical:logout"$user_info, array( '_xfToken' => $visitor['csrf_token_page'], 'redirect' => 'http://' $_SERVER["HTTP_HOST"] . $_SERVER['REQUEST_URI'] ) );
        }
    }
     
  18. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Я забыл указать, что мое решение - это имитация действий пользователей. Т.е. удаленный доступ, а не средствами самого сервера. Со стороны сервера, конечно же, все значительно проще.
     
    wergio нравится это.
  19. GELMESHIK

    GELMESHIK Местный

    Регистрация:
    24.05.12
    Сообщения:
    21
    Симпатии:
    1
    Версия XF:
    1.1.2
    Ошибка: http://g24mod.16mb.com/forum/test.php
     
  20. ivankuraev

    ivankuraev Местный

    Регистрация:
    06.08.11
    Сообщения:
    45
    Симпатии:
    21
    Вы в XF_ROOT указали http://g24mod.16mb.com/forum
    укажите путь относительно выполняемого скрипта

    совсем забыл
    в config.php
    нужно добавить следующее
    PHP:
    $config['cookie']['domain'] = '.site.ru';
    $config['cookie']['path'] = '/';
     
    GELMESHIK нравится это.

Поделиться этой страницей