Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Dismiss Notice

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

Discussion in 'Модификации клиента' started by Drak0n4ik, Jan 4, 2014.

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

    Drak0n4ik Старожил

    Trophy Points:
    103
    Каким образом клиент авторизируется на официальном сервере? В каком месте это происходит?
     
    poiNt_3D likes this.
  2. Хостинг MineCraft
    <
  3. Gummy Bear

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

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

    Drak0n4ik Старожил

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

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

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

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

    alexandrage Администратор

    Trophy Points:
    173
    Skype:
    alexandr0116
    У меня в сашке реализовано уже давно, посмотреть не?[DOUBLEPOST=1388801743,1388801494][/DOUBLEPOST]Клиент принимает 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,
     
    Last edited: Jan 4, 2014
  6. Автор темы
    Drak0n4ik

    Drak0n4ik Старожил

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

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

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

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

    alexandrage Администратор

    Trophy Points:
    173
    Skype:
    alexandr0116
    Потому что теперь это отдельная библиотека authlib-1.3.jar
    Я ее поместил в libraries.jar[DOUBLEPOST=1388803521,1388803471][/DOUBLEPOST]com.mojang.authlib.yggdrasil.YggdrasilMinecraftSessionService
     
    poiNt_3D, Alexgrist and Drak0n4ik like this.
  8. Автор темы
    Drak0n4ik

    Drak0n4ik Старожил

    Trophy Points:
    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
     
    Last edited: Jan 8, 2014
  9. numero8

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

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

    Drak0n4ik Старожил

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

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

    Такие дела.
     
    ler likes this.
  11. lowbob

    lowbob Новичок

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

    Drak0n4ik Старожил

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

    lowbob Новичок

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

    Drak0n4ik Старожил

    Trophy Points:
    103
    craftbukkit.jar/net/minecraft/util/com/mojang/authlib/yggdrasil/
     
  15. lowbob

    lowbob Новичок

    Trophy Points:
    23
    [​IMG]

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

    Drak0n4ik Старожил

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

    lowbob Новичок

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

    Drak0n4ik Старожил

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

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

    lowbob Новичок

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

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

    Drak0n4ik Старожил

    Trophy Points:
    103
    server.properties, файл лежит возле джарника сервера.
     
    lowbob likes this.
  21. Stairdeck

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

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

Share This Page