1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Авторизация клиента, 1.7.2

Тема в разделе "Модификации клиента", создана пользователем Drak0n4ik, 4 янв 2014.

  1. Автор темы
    Drak0n4ik

    Drak0n4ik Старожил

    Баллы:
    103
    Каким образом клиент авторизируется на официальном сервере? В каком месте это происходит?
     
    poiNt_3D нравится это.
  2. Gummy Bear

    Gummy Bear Активный участник

    Баллы:
    61
    Имя в Minecraft:
    GummyBear
    Просьба пользоваться поиском тык
     
  3. Автор темы
    Drak0n4ik

    Drak0n4ik Старожил

    Баллы:
    103
    Возможно ли следующее: сама игра не принимает участия в авторизации. За нее все делает лаунчер: и узнает валидный ли пользователь и все такое, отправляя игре только accessToken, который уже игра использует для авторизации на серверах, который, в свою очередь, эти серверы могут проверить у майнкрафта.

    Конечно же, возможно все что угодно. Но в клиенте нету авторизации, лишь обращение к Yggdrasil, который как раз и располагается в лаунчере. Надо бы проверить.

    UPD:
    Чушь. В коде буккита нету посылки на authserver моджангов.

    Кстати, где-нибудь есть коротко и понятно описано как сейчас работает авторизация в буккита?
     
  4. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    У меня в сашке реализовано уже давно, посмотреть не?
    Клиент принимает 2 параметра из профиля launcher_profiles.json "accessToken" и "uuid"
    --uuid 064e1199393746c60c92354f8daa0e01 --accessToken d0ba05f93c2b2a7d8b3bf4f6198cd5d1
    Но я пошел простым путем и сделал так.
    j.php
    PHP:
    <?php
    define
    ('INCLUDE_CHECK',true);
    include(
    "connect.php");
    //include("loger.php");
    if (($_SERVER['REQUEST_METHOD'] == 'POST' ) && (stripos($_SERVER["CONTENT_TYPE"], "application/json") === 0)) {
        
    $json json_decode($HTTP_RAW_POST_DATA);
     
    } else {

    }

    @
    $aT $json->accessToken; @$sP = @$json->selectedProfile; @$sI $json->serverId;
    @
    $user                      mysql_real_escape_string($aT);
    @
    $sessionid                mysql_real_escape_string($sP);
    @
    $serverid                  mysql_real_escape_string($sI);
    //$logger->WriteLine($user.' '.$sessionid.' '.$serverid);

    if (!preg_match("/^[a-zA-Z0-9_-]+$/"$user) || !preg_match("/^[a-zA-Z0-9:_-]+$/"$sessionid) || !preg_match("/^[a-zA-Z0-9_-]+$/"$serverid)){

    echo 
    '{"error":"Bad login","errorMessage":"Bad login"}';
    exit;
    }
     
        
    $query mysql_query("Select $db_columnUser From $db_table Where $db_columnUser='$user'") or die ("Ошибка");
        
    $row mysql_fetch_assoc($query);
        
    $realUser $row[$db_columnUser];

        if (
    $user !== $realUser)
            {
            exit (
    '{"error":"Bad login","errorMessage":"Bad login"}');
            }
     
        
    $result mysql_query("Select $db_columnUser From $db_table Where $db_columnSesId='$sessionid' And $db_columnUser='$user' And $db_columnServer='$serverid'") or die ("Ошибка");
        if(
    mysql_num_rows($result) == 1) echo '{"id":"ok"}';
        else
        {
            
    $result mysql_query("Update $db_table SET $db_columnServer='$serverid' Where $db_columnSesId='$sessionid' And $db_columnUser='$user'") or die ("Ошибка");
            if(
    mysql_affected_rows() == 1) echo '{"id":"ok"}';
            else echo 
    '{"error":"Bad login","errorMessage":"Bad login"}';
        }
    ?>
    h.php
    PHP:
    <?php
        define
    ('INCLUDE_CHECK',true);
        include (
    "connect.php");
        @
    $user mysql_real_escape_string($_GET['username']);
        @
    $serverid mysql_real_escape_string($_GET['serverId']);
     
        if (!
    preg_match("/^[a-zA-Z0-9_-]+$/"$user) || !preg_match("/^[a-zA-Z0-9_-]+$/"$serverid)){

            echo 
    '{"error":"Bad login","errorMessage":"Bad login"}'
         
        exit;
        }

        
    $query mysql_query("Select $db_columnUser From $db_table Where $db_columnUser='$user'") or die ("Ошибка");
        
    $row mysql_fetch_assoc($query);
        
    $realUser $row[$db_columnUser];

        if (
    $user !== $realUser)
        {
        exit (
    '{"error":"Bad login","errorMessage":"Bad login"}');
        } 
     
        
    $result mysql_query("Select $db_columnUser From $db_table Where $db_columnUser='$user' And $db_columnServer='$serverid'") or die (mysql_error());

        if(
    mysql_num_rows($result) == 1) echo '{"id":"ok"}';
        else echo 
    '{"error":"Bad login","errorMessage":"Bad login"}';
    ?>
    Лаунчером передаю

    "--accessToken", user,
    "--uuid", session,
     
    Последнее редактирование: 4 янв 2014
  5. Автор темы
    Drak0n4ik

    Drak0n4ik Старожил

    Баллы:
    103
    О’кей, вот еще не слишком умные вопросы.

    Где мне найти YggdrasilMinecraftSessionService? Меня смущает то, что он в launcher.jar. Мне его тырить оттуда? И что потом с ним делать? Игру-то я запускаю без помощи стандартного лаунчера. Тут (https://github.com/alexandrage/Fix-Sashok) я тот класс не нашел. В джарке игры тоже.

    Что делать с самим сервером? Какая его часть отвечает за авторизацию?

    Буду благодарен за ссылки. Да и спать пойду, голова на ночь плохо соображает. Надеюсь, в свою сторону найду не слишком много гнилых помидоров. Спасибо.
     
  6. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Потому что теперь это отдельная библиотека authlib-1.3.jar
    Я ее поместил в libraries.jar
    com.mojang.authlib.yggdrasil.YggdrasilMinecraftSessionService
     
    poiNt_3D, Alexgrist и Drak0n4ik нравится это.
  7. Автор темы
    Drak0n4ik

    Drak0n4ik Старожил

    Баллы:
    103
    Наконец дошли руки.

    Новый вопрос! Запускаю игру, в числе прочих передаю --uuid someUUID, --accessToken accessToken, --username username. Радостно смотрю, что я словлю в j.php. К сожалению, туда не приходит ничего, вообще. массив $_POST пуст. В $_GET тоже ничего, впрочем.

    Я уверен, что в authlib на сервере и клиенте указаны пути и даже правильно, так как функция запускается (создается лог-файл). Но вот ни юзернейма, ни сессии у меня нету. В каком месте я мог сглупить?

    Запускаю так:
    java тут-все-нужные-опции-и-подгрузка-библиотек net.minecraft.launchwrapper.Launch --username meh --version 1.7.2 --gameDir /path/to/game --assetsDir /path/to/assets --tweakClass com.mumfrey.liteloader.launch.LiteLoaderTweaker --accessToken accesstoken --uuid uuidishere
     
    Последнее редактирование: 8 янв 2014
  8. numero8

    numero8 Активный участник

    Баллы:
    63
    Имя в Minecraft:
    numero8
    Проверь ".htaccess". Если стоит CMS ".htaccess" может блокировать иные ссылки
     
  9. Автор темы
    Drak0n4ik

    Drak0n4ik Старожил

    Баллы:
    103
    Все оказалось прозаичнее. Ссылки были прописаны верные и, как оказалось, все отправляется. Бякой оказался PHP. Плевать ему хотелось что-то писать в $HTTP_RAW_POST_DATA. Да, если этот нюанс был указан в мануале, я его просмотрел. Суть в том, что тип данных "application/json", PHP не понимат о чем речь и скрывает его непонятно где.

    Вычитку принимаемых параметров делал следующим образом:
    $post = json_decode(file_get_contents("php://input"),true);

    Такие дела.
     
    ler нравится это.
  10. lowbob

    lowbob Новичок

    Баллы:
    23
    А что бы законектиться на сервер достаточно подправить YggdrasilMinecraftSessionService со стороны клиента?
     
  11. Автор темы
    Drak0n4ik

    Drak0n4ik Старожил

    Баллы:
    103
    Также его надо исправить со стороны сервера. Название файла то же.
     
  12. lowbob

    lowbob Новичок

    Баллы:
    23
    Ну 1 файл в либерес.джар , а второй где?
     
  13. Автор темы
    Drak0n4ik

    Drak0n4ik Старожил

    Баллы:
    103
    craftbukkit.jar/net/minecraft/util/com/mojang/authlib/yggdrasil/
     
  14. lowbob

    lowbob Новичок

    Баллы:
    23
    [​IMG]

    а что в нем исправлять? что в ссылках указывать? ( п.с у меня спигот)
     
  15. Автор темы
    Drak0n4ik

    Drak0n4ik Старожил

    Баллы:
    103
    С последним не работал, в чем разница не знаю. Вписывать же те же строчки, что и в клиенте. Проводя аналогию с 1.6, join — это joinserver, hasJoined — это checkserver. Указывать ссылки на функции авторизации.
     
  16. lowbob

    lowbob Новичок

    Баллы:
    23
    просто там обычно был путь конкретно до файла,а теперь до директории поидее.
    да и без этого конектит
     
  17. Автор темы
    Drak0n4ik

    Drak0n4ik Старожил

    Баллы:
    103
    What?
    В ссылках и раньше указывались адреса на свой хост к скрипту авторизации, что-то в стиле того, что там написано. Alexandrage выше указал. Более-мене у него описание тут http://www.rubukkit.org/threads/sashok724-launcher.42883/

    Цимес был в том, чтобы запилить кастомную авторизацию. Измени конфиг сервера на online-mode=true и тогда уже подключиться будет проблематичнее.
     
    lowbob нравится это.
  18. lowbob

    lowbob Новичок

    Баллы:
    23
    да тупанул, думал что там нужно указывать joinserver.php итд

    п.с где кстати этот online-mode=true ставить?
     
  19. Автор темы
    Drak0n4ik

    Drak0n4ik Старожил

    Баллы:
    103
    server.properties, файл лежит возле джарника сервера.
     
    lowbob нравится это.
  20. Stairdeck

    Stairdeck Активный участник Пользователь

    Баллы:
    68
    Skype:
    Stairdeck
    Имя в Minecraft:
    Stairdeck
    Я там всё указал, и на сервере, и в клиенте а пишет:
    Ошибка входа: Службы входа пользователей в данный момент не работают.
    Что делать?
     

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