Помощь Мод (OpenID) + DLE

Тема в разделе "DLE", создана пользователем viktor6, 28 янв 2014.

Информация :
Актуальная версия DataLife Engine 11.3
( Final Release v.11.3 | Скачать DataLife Engine | Скачать 11.3 demo )
Нужно ли обновляться | Как обновиться | Изменения в шаблонах
> Нет русских символов <
[Приватная тема DLE (Все подробности в ЛС к модератору раздела)]

Версии 11.2 и ниже - уязвимы!

Локализации | F.A.Q. | Внешний вид
Правила раздела | Правила форума
Обсуждение хайда карается баном!
В каждом сообщении указывайте версию DLE, которого они касаются!
Модераторы: killoff
  1. viktor6

    viktor6 Постоялец

    Регистр.:
    16 дек 2008
    Сообщения:
    139
    Симпатии:
    6
    Полазил по инету так и не нашол готового мода и решил своими убогими знаниями php сделать такой мод.
    И так что было сделано
    Кинул 2 файла по пути engine/modules/openid/
    functions.openid.php

    и
    openid.php
    В шаблоне login.tpl
    добавил такую строку
    Код:
    <!-- Mod -->
    {include file="engine/modules/openid/openid.php"}
    <!--  Mod -->
    перед
    Код:
    <input name="login" type="hidden" id="login" value="submit" />
    Но вот как подключить авторизацию из DLE не знаю прошу помощи в дальнейших действиях.

    что нужно изменить дописать в файле openid.php
    PHP:
    <?php

    //=====================================================
    // DataLife Engine 10.1
    //-----------------------------------------------------
    // Module for user authorization service
    // 
    //=====================================================


    if(!defined('DATALIFEENGINE'))
    {
        die(
    "Hacking attempt!");
    }

    require 
    'functions.openid.php';
    try
    {
        
    $openid=new LightOpenID('http://site.com/engine/modules/openid/openid.php');
        if(!
    $openid->mode)
        {
            if(isset(
    $_POST['openid_identifier']))
            {
                
    $openid->identity=$_POST['openid_identifier'];
                
    header('Location: '.$openid->authUrl());
            }
            }
        elseif(
    $openid->mode=='cancel'$openid_e_message='Пользователь отменил аутентификацию!';
        else
        {
            if(
    $openid->validate()) $openid_link=$openid->identity;
            else 
    $openid_e_message='Пользователь не вошел';
            
    //print_r($openid->getAttributes());
        
    }
    }
    catch(
    ErrorException $e){$openid_error=$e->getMessage();}

    if(isset(
    $openid_link))
    {
    $userpart explode("/"$openid_link);
    $user explode("-"$userpart[4]);

    //$openid_identity - ссылка на проифиль
    //$user[0] - идентификатор (account_id)
    //$user[1] - игровое имя (ник)

    echo "Profile: $openid_link <br />
    ID - 
    $user[0] <br />
    Nickname: 
    $user[1]";

    //Дальнейшие действия с переменными

    }
    else
    {
    echo 
    "<form method=\"post\"><input type=\"hidden\" name=\"openid_identifier\" value=\"ru.wargaming.net/id/\"></form>
    <a href=\"#\" onclick=\"document.forms[0].submit()\"><img src=\"/wg.png\"> Login</a>"
    ;
    }

    ?>
     

    Вложения:

    • Openid_dle.zip
      Размер файла:
      7,1 КБ
      Просмотров:
      17
  2. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.175
    Симпатии:
    2.195
    Тут надо начинать с обратного пути - что далжен делать с этой авторизацией сам ДЛЕ?
    Как осуществляется привязка в БД к этому OpenID? Как регистрируется пользователь в системе?

    Если нужно просто показывать "Вы авторизированы" - достаточно просто этого OpenID, но если нужно, чтобы это ещё и отражалось в комментариях, ЛС и прочем, как это обычно бывает - нужно переписывать сам ДЛЕ!
     
    viktor6 нравится это.
  3. viktor6

    viktor6 Постоялец

    Регистр.:
    16 дек 2008
    Сообщения:
    139
    Симпатии:
    6
    Вот что получлось но работает както все криво
    из этого места уже не дает авторизироваться Перейти по ссылке
    пишет Hacking attempt!
    PHP:
    <script type="text/javascript" charset="utf-8">
    /*function login() {
    alert ("OKay");
      // document.forms[0].submit();
    };*/
    </script>

    <?php

    //=====================================================
    // DataLife Engine 10.1
    //-----------------------------------------------------
    // Module for user authorization service
    //
    //=====================================================




    require 'functions.openid.php';
    try
    {
    $openid=new LightOpenID('http://dle.plusnet.ks.ua/engine/modules/openid/openid.php');
    if(!
    $openid->mode)
    {
    if(isset(
    $_POST['openid_identifier']))
    {
    $openid->identity=$_POST['openid_identifier'];
    header('Location: '.$openid->authUrl());
    }
    }
    elseif(
    $openid->mode=='cancel'$openid_e_message='Пользователь отменил аутентификацию!';
    else
    {
    if(
    $openid->validate()) $openid_link=$openid->identity;
    else 
    $openid_e_message='Пользователь не вошел';
    //print_r($openid->getAttributes());
    }
    }
    catch(
    ErrorException $e){$openid_error=$e->getMessage();}

    if(isset(
    $openid_link))
    {
    $userpart explode("/"$openid_link);
    $user explode("-"$userpart[4]);

    //$openid_identity - ссылка на проифиль
    //$user[0] - идентификатор (account_id)
    //$user[1] - игровое имя (ник)

    echo "Profile: $openid_link <br />
    ID - 
    $user[0] <br />
    Nickname: 
    $user[1]";
    //Дальнейшие действия с переменными

    /*REGISTER USER*/
    $regpassword md5$user[0] );
    $name trim$db->safesqlhtmlspecialchars$user[1], ENT_COMPAT$config['charset'] ) ) );
    $name preg_replace('#\s+#i'' '$name);
    $email $openid_link;

    $add_time time() + ($config['date_adjust'] * 60);
    $_IP get_ip();
    if( 
    intval$config['reg_group'] ) < $config['reg_group'] = 4;

    $row $db->super_query"SELECT * FROM " USERPREFIX "_users WHERE xfields = ".$user[0]."" );

    if (!
    $row['user_id']) {

    $db->query"INSERT INTO " USERPREFIX "_users (name, password, email, reg_date, lastdate, user_group, info, signature, favorites, xfields, logged_ip) VALUES ('$name', '$regpassword', '$email', '$add_time', '$add_time', '" $config['reg_group'] . "', '', '', '', '".$user[0]."', '" $_IP "')" );
    $id $db->insert_id();


    }
    else {
    $id $row['user_id'];
    if (
    $row['name']<>$user[1]) {
    $db->super_query"UPDATE " USERPREFIX "_users SET name='".$user[1]."' WHERE user_id = ".$row['user_id']."" );
    }
    }
    set_cookie"dle_user_id"$id365 );
    set_cookie"dle_password"$user[0], 365 );

    $_SESSION['dle_user_id'] = $id;
    $_SESSION['dle_password'] = $user[0];
    header('Location: '.$_SERVER["PHP_SELF"]);
    }
    else
    {
    echo 
    "<form method=\"post\"><input type=\"hidden\" name=\"openid_identifier\" value=\"ru.wargaming.net/id/\"></form>
    <a href=\"#\" onclick=\"document.forms[0].submit()\"><img src=\"http://dle.plusnet.ks.ua/engine/modules/openid/visual-wot-logo.png\" align=\"center\" width=\"150px\"></a>"
    ;
    }

    ?>
     
    Последнее редактирование: 8 фев 2014
  4. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.175
    Симпатии:
    2.195
    PHP:
    <?
    // Соединяемся с БД
    if (@mysql_connect('localhost'$user$pass)){
      
    $db mysql_connect('localhost'$user$pass);
    } else {
      
    // для теста на денвере
      
    $db mysql_connect('localhost''root');
    };
    // выбираем название БД
    mysql_select_db($db_name$db);
    ЧТО ЭТО???? Вам зачем класс работы с БД дан?
    Где объявление, что мы работаем внутри ДЛЕ?
    Почему вообще модуль подключён прямым вызовом файла, а не вызовом из init.php/engine.php???? На худой конец, есть API, т.е. подключение через {include file=mod.php}...

    Вам надо не просто файлик закинуть на FTP, не связанный с ДЛЕ, а править файл /engine/modules/init/init.php - в нём идёт стандартная авторизация. И именно его надо модифицировать...

    Итог, модуль никак не связан с ДЛЕ, а Вы хотите, чтобы он работал - так не получится.
     
    viktor6 нравится это.
  5. viktor6

    viktor6 Постоялец

    Регистр.:
    16 дек 2008
    Сообщения:
    139
    Симпатии:
    6
    Смотри последнее мое сообщения там уже файл какбы поправил под дле.
    Потому и обратился на форум то что не знаю как моды писать
     
  6. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.175
    Симпатии:
    2.195
    Честно говоря, лень смотреть весь код... Давай начнём с нуля...
    1) Чтобы авторизовать человека - его сначала нужно зарегистрировать. Т.е. необходимо из OpenID получить данные и загнать их в ДЛЕ (хотя бы логин и пароль). Как ты это делаешь?
     
  7. viktor6

    viktor6 Постоялец

    Регистр.:
    16 дек 2008
    Сообщения:
    139
    Симпатии:
    6
    Вот предыдущий мой пост я напечатал скрипт
    вместо пароля идет индефикатор или другое значения можно подставить
    //$user[0] - идентификатор (account_id)
    $regpassword = md5( $user[0] );


    Думал взять мод из ulogin и переделать под это дело но знаний маловато

    PHP:
    $userpart explode("/"$openid_link);
    $user explode("-"$userpart[4]);

    //$openid_identity - ссылка на проифиль
    //$user[0] - идентификатор (account_id)
    //$user[1] - игровое имя (ник)

    echo "Profile: $openid_link <br />
    ID - 
    $user[0] <br />
    Nickname: 
    $user[1]";
    //Дальнейшие действия с переменными

    /*REGISTER USER*/
    $regpassword md5$user[0] );
    $name trim$db->safesqlhtmlspecialchars$user[1], ENT_COMPAT$config['charset'] ) ) );
    $name preg_replace('#\s+#i'' '$name);
    $email $openid_link;

    $add_time time() + ($config['date_adjust'] * 60);
    $_IP get_ip();
    if( 
    intval$config['reg_group'] ) < $config['reg_group'] = 4;

    $row $db->super_query"SELECT * FROM " USERPREFIX "_users WHERE xfields = ".$user[0]."" );

    if (!
    $row['user_id']) {

    $db->query"INSERT INTO " USERPREFIX "_users (name, password, email, reg_date, lastdate, user_group, info, signature, favorites, xfields, logged_ip) VALUES ('$name', '$regpassword', '$email', '$add_time', '$add_time', '" $config['reg_group'] . "', '', '', '', '".$user[0]."', '" $_IP "')" );
    $id $db->insert_id();
     
  8. Demon425

    Demon425

    Регистр.:
    9 июл 2008
    Сообщения:
    461
    Симпатии:
    116
    Недавно тоже связался с этой авторизацией...

    Оно в принципе даёт авторизоваться только с корневой директории /
    Если в адресной строке /index.php?xxxxxxx - выскакивает Hacking attempt!

    По коду...

    1. Поле email нужно заполнить чем-то другим, но не ссылкой...

    2. ссылку на профиль лучше пихать в другие ячейки, т.к. ячейка почты предназначена для почты и при попытке редактирования юзера в админке либо на странице профиля - будет ошибка неправильной почты при сохранении. Не даст сохранить, пока ты не введешь правильную почту по маске.

    3. ID также лучше писать в отдельную ячейку, а не в xfields. Если ты захочешь использовать дополнительные поля профиля - авторизация перестанет работать.

    Поэтому надо создавать 2 дополнительные поля, я создал wot_profile_link и wot_user_id, и соответствующим образом сменил часть кода.

    4. В качестве пароля используется банальный MD5... что это значит? Можно посмотреть игровой ник любого участника клана и авторизоваться под ним...подменив форму в браузере и отправив POST-запрос. А если он в другой группе и у него есть права?...

    Т.к. прямая авторизация у нас не планируется, следует генерировать более сложный хэш. Но следует учесть ограничение поля password в 32 символа. Это может быть комбинация base64encode + salt, pack, hash и любых прочих зверств:) далее все этого загоняем в MD5, главное, чтобы алгоритм был конфиденциален. Либо банальный rand() + md5.
     
    viktor6 нравится это.
  9. Demon425

    Demon425

    Регистр.:
    9 июл 2008
    Сообщения:
    461
    Симпатии:
    116
    Итак. Потестил немного скрипт.

    Если вносить изменения по части пароля, например усложнить алгоритм, вместо
    Код:
    $regpassword = md5( $user[0] );
    поставить
    Код:
    $salt = "r8nbrn8btfyg8n";
    $mix = $salt.$user[0];
    $regpassword = md5($mix);
    
    В этом случае новый пользователь регистрируется, но вот авторизоваться невозможно. Пробовал разные комбинации, авторизация работает только если в md5 загонять $user[0] либо $user[1]

    UPDATED

    В общем я идиот :) нужно также в нижней части скрипта внести соответстующие изменения, в этой части:
    Код:
    set_cookie( "dle_password", $mix, 365 );
    $_SESSION['dle_password'] = $mix;
    $salt меняем под себя, набираем любою билиберду.

    Также в папку со скриптом добавить .htaccess с
    Код:
    Order Deny,Allow
    Deny from all
    
    картинки перенести в папку шаблона.
     
    Последнее редактирование: 4 ноя 2014
    viktor6 нравится это.
  10. viktor6

    viktor6 Постоялец

    Регистр.:
    16 дек 2008
    Сообщения:
    139
    Симпатии:
    6
    Ну как дело продвигается?