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

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

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

Загрузка
  1. megavolt

    megavolt Местный

    Регистрация:
    31.10.10
    Сообщения:
    80
    Симпатии:
    49
    Частный вариант, но, может, сгодится кому-нибудь...
    Форум на домене, на поддоменах юзера также нужно определять по кукам, базы данных на общем localhost . Поддомены в конкретном случае на CI, поэтому запросы к базе в его стиле.

    Код:
    //если юзер есть в куках - возврат его user_id, иначе 0
    public $salt='00000000000000000000'; //соль Вашего форума
      private function _GetVisitorByCookie() {
        if (!isset($_COOKIE['xf_user'])) return 0;
          $userCookieParts = explode(',', $_COOKIE['xf_user']);
          if (count($userCookieParts) < 2) return 0;
          $userId = intval($userCookieParts[0]);
          $rememberKey = $userCookieParts[1];
          if (!$userId || !$rememberKey) return 0 ;
          $this->db->where('user_id',$userId);
          $query = $this->db->get('ВАШЕ_ИМЯ_БАЗЫ_ФОРУМА.xf_user_authenticate');
          $row = $query->row_array();
          if (sha1($this->salt.$row['remember_key']) !== $rememberKey) return 0 ;
          return $userId;
        }
    Ну и кусок получения полных данных о существующем юзере:

    Код:
    $this->db->where('user_id',$visitor_id);// $visitor_id - полученный из предыдущей функции id
          $query = $this->db->get(' ВАШЕ_ИМЯ_БАЗЫ_ФОРУМА .xf_user');
          $visitor = $query->row_array();
     
  2. Leiter

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

    Регистрация:
    02.04.13
    Сообщения:
    9
    Симпатии:
    0
    Версия XF:
    1.1.4
    Вопрос по рассматриваемой проблеме. Здесь я так понимаю просто проверка пароля:
    Код:
    $is_valid = $auth->authenticate($user_id, $pwd);
    В xenовской библиотеке:
    Код:
    public function authenticate($userId, $password)
        {
            if (!is_string($password) || $password === '' || empty($this->_data))
            {
                return false;
            }
     
            $userHash = $this->_createHash($this->_createHash($password) . $this->_data['salt']);
            return ($userHash === $this->_data['hash']);
        }
    А есть ли возможность реально выполнить рабочую авторизацию. Например, вызываем my_login.php. А после этого, заходя в форум, я буду уже авторизованным.
    Сразу поясню. Может быть у кого-то есть более грамотное решение. Есть сайт с самописным форумным движком. Планируется заменить его на xen. И планирую сделать так: при авторизации на своем сайте, выполнять программную авторизацию еще и в xen.
     
  3. ivankuraev

    ivankuraev Местный

    Регистрация:
    06.08.11
    Сообщения:
    45
    Симпатии:
    21
    #17 сообщение в теме не подходит?
     
  4. Leiter

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

    Регистрация:
    02.04.13
    Сообщения:
    9
    Симпатии:
    0
    Версия XF:
    1.1.4
    В #17 вижу: получение данных уже авторизованного пользователя; формирование ссылки на выход из форума.
    Этот механизм можно использовать для отключения из форума. И аналогичный механизм нужен для авторизации. Т.е. имеется логин (или user_id), пароль; затем выполняется код типа #10. Но там лишь идет проверка на правильность пароля, а не сам механизм авторизации.
     
  5. ivankuraev

    ivankuraev Местный

    Регистрация:
    06.08.11
    Сообщения:
    45
    Симпатии:
    21
    В базе будет две таблицы с пользователями или одна, от форума?
    В сообщении 17 идет код проверки на авторизацию на сторонних скриптах.
    Для авторизации просто посмотрите форму со страницы /login форума.
    И сделайте аналогичную на своих страницах.
     
  6. Leiter

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

    Регистрация:
    02.04.13
    Сообщения:
    9
    Симпатии:
    0
    Версия XF:
    1.1.4
    При этом я просто выполню авторизацию в XF.
    Мне же нужно, выполнить авторизацию на своем сайте + в XF в одном скрипте. По сути доработать свою старую авторизацию.
     
  7. ivankuraev

    ivankuraev Местный

    Регистрация:
    06.08.11
    Сообщения:
    45
    Симпатии:
    21
    Старую авторизацию заменить на авторизацию xF.
    Если пользователь авторизован, то результатом выполнения кода из сообщения 17 будет массив с его данными.
     
    Leiter нравится это.
  8. Leiter

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

    Регистрация:
    02.04.13
    Сообщения:
    9
    Симпатии:
    0
    Версия XF:
    1.1.4
    А по его данным авторизации реализовать авторизацию на своем сайте после редиректа. Спасибо.
     
  9. ivankuraev

    ivankuraev Местный

    Регистрация:
    06.08.11
    Сообщения:
    45
    Симпатии:
    21
    Имеете ввиду, установить вторую куки?
     
  10. Leiter

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

    Регистрация:
    02.04.13
    Сообщения:
    9
    Симпатии:
    0
    Версия XF:
    1.1.4
    Нет. Я сначала думал сохранить старую авторизацию на своем сайте. Движок самописный - придется много править. Но сейчас думаю, что стоит полностью перейти на авторизацию ксена.
    Вопрос только в переносе паролей. На моем сайте md5. В ксене другая.
     
  11. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Для ксена можно использовать собственную реализацию хеша. Это не сложно. По этому принципу ксен, например, использует булковские пароли после импорта.
     
  12. Leiter

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

    Регистрация:
    02.04.13
    Сообщения:
    9
    Симпатии:
    0
    Версия XF:
    1.1.4
    Т.е. нужно будет отредактировать процедуру проверки пароля в xf?
     
  13. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Не отредактировать, а добавить Вашу схему. Затем название этой схемы как раз и записывается в базу вместе с хешем и с солью (при наличии). А при проверке ксен берет для пользователя его схему и хеш с солью, вызывает указанный метод и сверяет результат. Все достаточно просто.
    Схема аутентификации описывается одним файлом и должна находиться в library/XenForo/Authentication/XXX.php. В базу записывается что-то подобное:
    PHP:
    array( 'scheme_class' => 'XenForo_Authentication_XXX''data' => array( 'hash' => 'password''salt' => 'salt' ) ) 
    Здесь XXX - это и есть название файла и название вашей схемы. Подсмотреть, как та же булка там сделана или ксеновские пароли, можете в той же папке с соответствующим названием. Ксеновские пароли работают по схеме Core.
     
  14. Leiter

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

    Регистрация:
    02.04.13
    Сообщения:
    9
    Симпатии:
    0
    Версия XF:
    1.1.4
    Еще нюанс по этой же теме.
    Авторизация проходит нормально из формы моего сайта. Но проблема теперь возникает.
    Затем использую код из поста #17. Отдельно (без дополнительных кодов) он срабатывает нормально, но в совокупности с кодами сайта возникают ошибки типа:
    Код:
    Strict Standards: Non-static method DB::isManip() should not be called statically, assuming $this from incompatible context in \modules\PEAR\DB\mysql.php on line 300
    Strict Standards: Non-static method DB::isError() should not be called statically, assuming $this from incompatible context in \modules\PEAR\DB\common.php on line 1163
    Есть ли возможность как-то обходить такие камни, без переписывания своего сайта? Я так понимаю, повторно используются одни и те же библиотеки.
     
  15. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Нет. Хотя, можно тупо игнорировать эти ошибки и скрыть их. Но это не решение проблемы. Ведь при переходе на более новую версию PHP такие ошибки могут вообще стать фатальными. И т.д. и т.п.
    Нет, проблема не в библиотеках. Ксен использует Zend Framework, а Вы, судя по всему, используете свой фреймворк с использованием пировских библиотек. Т.е. общих библиотек нет.
     
  16. Leiter

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

    Регистрация:
    02.04.13
    Сообщения:
    9
    Симпатии:
    0
    Версия XF:
    1.1.4
    И какое решение?
     
  17. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Переписать проблемные места, если важно сохранить свой сайт. Если это не обязательно (сохранить свой старый движок), то есть смысл от него отказаться. Вот что поставить взамен, даже не знаю. Возможно, Вы сможете написать свой сайт с использованием ксена и зенда.
     
  18. GERAsimov

    GERAsimov Новичок

    Регистрация:
    02.09.16
    Сообщения:
    8
    Симпатии:
    0
    Версия XF:
    1.5.9
    Подскажите, пожалуйста, как авторизоваться в Ксене сторонним файлом так, что бы пользователь стал онлайн на форуме и дата последнего захода менялась.
    В общем как сторонним файлом полноценно залогиниться в Ксену подключая его классы?

    Благодарю.
     

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