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

Dialog

Проверенные
Сообщения
83
Реакции
15
Баллы
5,510
Ситуация такая, есть форум xxx.ru, там же приделан еще один домен yyy.xxx.ru только с 1 пустой страничкой index.php

Вопрос в следующем: как правильно выдернуть информацию о пользователе из кук или сессии для авторизации, вернее мне нужна просто информация об user_id.

Расклад: Рафик не регался на форуме и зашел на yyy.xxx.ru, его редиректнуло (ну или вылез фрейм) на регистрацию на форуме xxx.ru. Рафик зарегался и подтвердил почту. Снова зашел на yyy.xxx.ru и посередине экрана у него показывает его user_id.

ps: если есть возможность, то без аддонов
 
вернее мне нужна просто информация об user_id.
Ставим куку на весь домен
Это настройка в config.php
Код:
$config['cookie'] = array(
    'prefix' => 'xf_',
    'path'   => '/',
    'domain' => '.xxx.ru'
    );

Затем ищем делам модификацию шаблона page_container_js_body, заменяя
Код:
</xen:hook>
на
Код:
<xen:if is="{$visitor.user_id}">
    var expires = new Date(new Date().getTime() + 7 * 86400000); // 7 days
    $.setCookie('userid', {$visitor.user_id}, expires);
</xen:if>
$0

Теперь на сайте
читаем куку xf_userid - в ней id пользователя. Рафик не виноват.

Костыльненько, ибо пользователь может прислать в куке все что угодно.
 
Костыльненько, ибо пользователь может прислать в куке все что угодно.
Это даже костылем то трудно назвать, с темже успехом можно просить самого пользователя вписать свой ИД в какоенибудь поле :confused:
 
Это даже костылем то трудно назвать, с темже успехом можно просить самого пользователя вписать свой ИД в какоенибудь поле :confused:
Пункт 1: Рафик опять мэдленно берет с полки хрустальный шар...
 
Хорошо, такой вопрос. Как ксен получает из куки xf_user полную сессию ?
1%2Casdasdasdasdasdasdasdasdasdasdasdasdasd
1 - это понятно что ид
%2C - запятая
А вот следующие 40 символов он с чем сравнивает ?
 
Посмотри таблицу xf_session
это было первое что я посмотрел, конкретно вот этот хеш, записанный в куку, я вообще нигде найти не могу

В таблице xf_user_authenticate тоже нет такого ключа.

Вот то что смог найти в session.php, но в ООП я прямо скажем совсем неочень. Знает кто что он дальше делает ?
PHP:
$userCookie = $request->getCookie($cookiePrefix . 'user');

            if ($userCookie)
            {
                /** @var $userModel XenForo_Model_User */
                $userModel = XenForo_Model::create('XenForo_Model_User');
                if ($userId = $userModel->loginUserByRememberCookie($userCookie))
                {
                    $user = $userModel->getFullUserById($userId);

дальше model/user.php
PHP:
$userCookieParts = explode(',', $userCookie);
        if (count($userCookieParts) < 2)
        {
            return false;
        }

        $userId = intval($userCookieParts[0]);
        $rememberKey = $userCookieParts[1];
        if (!$userId || !$rememberKey)
        {
            return false;
        }

        $auth = $this->getUserAuthenticationRecordByUserId($userId);


Хм, возможно это всетаки и есть ремембер кей:
PHP:
public function getUserAuthenticationRecordByUserId($userId)
    {
        return $this->_getDb()->fetchRow('

            SELECT *
            FROM xf_user_authenticate
            WHERE user_id = ?

        ', $userId);
    }
 
Последнее редактирование:
Кука xf_session == полю session_id таблицы xf_session. Примени unserialize к полю session_data и получишь много чего, в том числе user_id.
А куки xf_user может и не быть, например, если не поставить галочку "запомнить".
 
Последнее редактирование:
  • Мне нравится
Реакции: Hope
Кука xf_session == полю session_id таблицы xf_session. Примени unserialize к полю session_data и получишь много чего, в том числе user_id
Зачем мне PHP кука сессии которая сдохнет при закрытии браузера, как сериализацию даты делать я вкурсе. Лучше расшифруй как он сравнивает remember key или это просто сравнение строк ? :

PHP:
public static function hashEquals($known, $user)
    {
        if (function_exists('hash_equals'))
        {
            return hash_equals($known, $user);
        }
        else
        {
            if (!is_string($known))
            {
                trigger_error('Expected known_string to be a string', E_USER_WARNING);
            }
            if (!is_string($user))
            {
                trigger_error('Expected user_string to be a string', E_USER_WARNING);
            }

            $knownLen = strlen($known);
            $userLen = strlen($user);

            if ($knownLen !== $userLen)
            {
                return false;
            }

            $result = 0;
            for ($i = 0; $i < $knownLen; $i++)
            {
                $result |= ord($known[$i]) ^ ord($user[$i]);
            }

            return ($result === 0);
        }
    }
 
Чуть в сторону еще вопрос: можно ли как-то получить юзер ид в прилепленном из xen:callback getHtml php файле. Т.е. сейчас получаю через:

Код:
$userinfo = XenForo_Visitor::getInstance();
$user_id = $userinfo['user_id'];


Обязательно ли каждый раз вызывать этот метод или есть какое-то более упрощенное действие ? Только такое, чтобы пользователь не смог его подделать.
 
Последнее редактирование модератором:
Чуть в сторону еще вопрос
Это я так, пример накидал
Код:
<xen:callback class="bdShop_Items" method="getHtml" params="{$visitor.user_id}"></xen:callback>

PHP:
<?php

class bdShop_Items
{
    public static function getHtml(){
        return func_get_arg(1);
    }
}

Источник:
 
Последнее редактирование:
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу