2015-02-07 01:39:41 +05:30
Авторизация для Minecraft
-------------------------
Здесь приведена информация по авторизации для лаунчеров и серверов Minecraft через сервис авторизации Ely.by.
Протокол авторизации реализован максимально похожим на `оригинальный протокол авторизации Mojang <http://wiki.vg/Authentication> `_ ,
но тем не менее эта документация описывает все доступные функции конкретно сервиса авторизации Ely.by.
Общие положения
===============
2015-08-23 22:55:18 +05:30
* В с е запросы должны выполняться на URL **https://authserver.ely.by** .
2015-02-07 01:39:41 +05:30
* При успешном запросе, сервер вернёт ответ с о статусом 200. Любой другой код свидетельствует о б ошибке.
2015-08-23 22:55:18 +05:30
* Сервер всегда отвечает JSON данными, кроме случаев системных ошибок и ответов на legacy запросы. Учитывайте это для
отображения пользователю правильного сообщения о б ошибке.
2015-02-07 01:39:41 +05:30
2021-03-09 17:04:39 +05:30
* В случае стандартной ошибки, вы получите следующие данные:
2015-02-07 01:39:41 +05:30
.. code-block :: javascript
{
"error": "Краткое описание ошибки",
"errorMessage": "Более длинное описание ошибки на английском языке, пригодное для отображения пользователю."
}
Предусмотренные ошибки
~~~~~~~~~~~~~~~~~~~~~~
2015-08-23 22:55:18 +05:30
В отличие от оригинального протокола, на Ely применяется меньший зоопарк ошибок:
2015-02-07 01:39:41 +05:30
.. list-table ::
:widths: 20 50 30
:header-rows: 1
* - Ошибка (error)
- Причина
- Решение
* - IllegalArgumentException
- Вы передали неполный список данных для выполнения запроса.
- Внимательно перепроверьте что вы шлёте в запросе и что указано в документации.
* - ForbiddenOperationException
- Пользователь ввёл/разработчик передал неверные значения.
- Необходимо вывести пользователю уведомление о неправильно введённых данных.
2015-08-23 22:55:18 +05:30
Для индикации ошибки Not Found используется ответ с 404 статусом.
2015-02-07 01:39:41 +05:30
Авторизация в лаунчере
======================
2021-03-09 17:04:39 +05:30
В этом разделе описана авторизация для игрового лаунчера и описывает действия, необходимые для получения `` accessToken `` для игрового клиента Minecraft. В результате авторизации будет получен JWT-токен с :ref: `правами доступа <available_scopes>` `` minecraft_server_session `` .
2015-02-07 01:39:41 +05:30
2021-03-09 17:04:39 +05:30
.. attention :: Мы рекомендуем использовать :doc: `протокол авторизации OAuth 2.0 <oauth>` с запросом :ref: `прав доступа <available_scopes>` `` minecraft_server_session `` , как более безопасный и удобный для пользователя метод.
2015-02-07 01:39:41 +05:30
2021-03-09 17:04:39 +05:30
.. function :: POST /auth/authenticate
2015-02-07 01:39:41 +05:30
2021-03-09 17:04:39 +05:30
Непосредственная авторизация пользователя, используя е г о логин (ник или E‑ mail), пароль и токен двухфакторной аутентификации.
2015-02-07 01:39:41 +05:30
2021-03-09 17:04:39 +05:30
:param string username: Никнейм пользователя или е г о E‑ mail (более предпочтительно).
:param string password: Пароль пользователя или комбинация ``пароль:токен``.
2020-04-10 18:57:24 +05:30
:param string clientToken: Уникальный токен лаунчера пользователя.
2021-03-09 17:04:39 +05:30
:param bool requestUser: Если поле передано как ``true``, то в ответе сервера будет присутствовать поле ``user``.
2015-02-07 01:39:41 +05:30
2021-03-09 17:04:39 +05:30
Система аккаунтов Ely.by поддерживает защиту пользователей посредством двухфакторной аутентификации. В оригинальном протоколе авторизации Mojang не предусмотрено возможности для передачи TOTP-токенов. Для решения этой проблемы и сохранения совместимости с реализацией сервера `Yggdrasil <https://minecraft.gamepedia.com/Yggdrasil> `_ , мы предлагаем передавать токен в поле `` password `` в формате `` пароль:токен `` .
К сожалению, не все пользователи осведомлены о б этой возможности, поэтому будет лучше при получении ошибки о защищённости аккаунта пользователя двухфакторной аутентификацией явно запросить у него токен и склеить е г о программно.
Логика следующая:
#. Если пользователь указал верные логин и пароль, но для е г о аккаунта включена двухфакторная аутентификация, вы получите ответ с `` 401 `` статусом и следующим содержимым:
.. code-block :: javascript
{
"error": "ForbiddenOperationException",
"errorMessage": "Account protected with two factor auth."
}
#. При получении этой ошибки, необходимо запросить у пользователя ввод TOTP‑ то ке на , после чего повторить запрос на авторизацию с теми же учётными данными, добавив к паролю постфикс в виде `` :токен `` , где `` токен `` — это значение, введённое пользователем.
Если пароль пользователя был "password123", а токен "123456", то после склейки поле `` password `` примет значение "password123:123456".
#. Если в результате этих действий вы получите ответ с `` 401 `` статутом и `` errorMessage `` "Invalid credentials. Invalid email or password.", то это будет свидетельствовать о том, что переданный токен неверен и е г о нужно перезапросить у пользователя.
Если все данные будут переданы верно, вы получите следующий ответ:
2015-02-07 01:39:41 +05:30
.. code-block :: javascript
{
2021-03-09 17:04:39 +05:30
"accessToken": "Длинна я_с тр о ка _с о де р жа ща я_access_token",
"clientToken": "Пе р е да нный_в_за пр о с е _client_token",
"availableProfiles": [
{
"id": "UUID_по льзо ва те ля_б е з_де фис о в",
"name": "Т е ку щий_username_по льзо ва те ля"
}
],
"selectedProfile": {
"id": "UUID_по льзо ва те ля_б е з_де фис о в",
"name": "Т е ку щий_username_по льзо ва те ля"
},
"user": { /* Только если передан параметр requestUser * /
"id": "UUID_по льзо ва те ля_б е з_де фис о в",
"username": "Т е ку щий_username_по льзо ва те ля",
"properties": [
{
"name": "preferredLanguage",
"value": "ru"
}
]
2015-02-07 01:39:41 +05:30
}
}
2021-03-09 17:04:39 +05:30
.. function :: POST /auth/refresh
2015-02-07 01:39:41 +05:30
2021-03-09 17:04:39 +05:30
Обновляет валидный `` accessToken `` . Этот запрос позволяет не хранить на клиенте е г о пароль, а оперировать только сохранённым значением `` accessToken `` для практически бесконечной возможности проходить авторизацию.
2015-02-07 01:39:41 +05:30
2021-03-09 17:04:39 +05:30
:param string accessToken: Уникальный ключ, полученный после авторизации.
2020-04-10 18:57:24 +05:30
:param string clientToken: Уникальный идентификатор клиента, относительно которого получен accessToken.
2021-03-09 17:04:39 +05:30
:param bool requestUser: Если поле передано как ``true``, то в ответе сервера будет присутствовать поле ``user``.
2015-02-07 01:39:41 +05:30
2021-03-09 17:04:39 +05:30
.. note :: В оригинальном протоколе так же передаётся значение `` selectedProfile `` , но в реализации Mojang он не влияет ни на что. Наша реализация сервера авторизации игнорирует этот параметр и опирается на значения `` accessToken `` и `` clientToken `` .
2015-02-07 01:39:41 +05:30
В случае получения какой-либо предусмотренной ошибки, следует заново запросить пароль пользователя и произвести
обычную авторизацию.
Успешный ответ:
.. code-block :: javascript
{
2021-03-09 17:04:39 +05:30
"accessToken": "Н о ва я_длинна я_с тр о ка _ с о де р жа ща я_access_token",
"clientToken": "Пе р е да нный_в_за пр о с е _client_token",
"selectedProfile": {
"id": "UUID_по льзо ва те ля_б е з_де фис о в",
"name": "Т е ку щий_username_по льзо ва те ля"
},
"user": { /* Только если передан параметр requestUser * /
"id": "UUID_по льзо ва те ля_б е з_де фис о в",
"username": "Т е ку щий_username_по льзо ва те ля",
"properties": [
{
"name": "preferredLanguage",
"value": "ru"
}
]
2015-02-07 01:39:41 +05:30
}
}
2021-03-09 17:04:39 +05:30
.. function :: POST /auth/validate
2015-02-07 01:39:41 +05:30
Этот запрос позволяет проверить валиден ли указанный accessToken или нет. Этот запрос не обновляет токен и е г о время
2019-09-02 03:25:00 +05:30
жизни, а только позволяет удостовериться, что он ещё действительный.
2015-02-07 01:39:41 +05:30
2021-03-09 17:04:39 +05:30
:param string accessToken: Токен доступа, полученный после авторизации.
2015-02-07 01:39:41 +05:30
2021-03-09 17:04:39 +05:30
Успешным ответом будет являться пустое тело. При ошибке будет получен **400** или **401** статус. Пример ответа сервера при отправке истёкшего токена:
2019-09-02 03:25:00 +05:30
.. code-block :: javascript
{
"error: "ForbiddenOperationException",
"errorMessage": "Token expired."
}
2015-02-07 01:39:41 +05:30
2021-03-09 17:04:39 +05:30
.. function :: POST /auth/signout
2015-02-07 01:39:41 +05:30
2015-08-23 22:55:18 +05:30
Этот запрос позволяет выполнить инвалидацию всех выданных пользователю токенов.
2021-03-09 17:04:39 +05:30
:param string username: Никнейм пользователя или е г о E-mail (более предпочтительно).
2020-04-10 18:57:24 +05:30
:param string password: Пароль пользователя.
2015-08-23 22:55:18 +05:30
Успешным ответом будет являться пустое тело. Ориентируйтесь на поле **error** в теле ответа.
2015-02-07 01:39:41 +05:30
2021-03-09 17:04:39 +05:30
.. function :: POST /auth/invalidate
2015-02-07 01:39:41 +05:30
2015-08-23 22:55:18 +05:30
Запрос позволяет инвалидировать accessToken. В случае, если переданный токен не удастся найти в хранилище токенов,
ошибка не будет сгенерирована и вы получите успешный ответ.
Входные параметры:
2021-03-09 17:04:39 +05:30
:param string accessToken: Уникальный ключ, полученный после авторизации.
2020-04-10 18:57:24 +05:30
:param string clientToken: Уникальный идентификатор клиента, относительно которого получен accessToken.
2015-08-23 22:55:18 +05:30
Успешным ответом будет являться пустое тело. Ориентируйтесь на поле **error** в теле ответа.
2015-02-07 01:39:41 +05:30
Авторизация на сервере
======================
Эти запросы выполняются непосредственно клиентом и сервером при помощи внутреннего кода или библиотеки authlib
(начиная с версии 1.7.2). Они актуальны только в том случае, если вы уже произвели авторизацию и запустили игру с валидным
accessToken. Вам остаётся только заменить пути внутри игры/библиотеки на привидённые ниже пути.
Поскольку непосредственно изменить что-либо в работе authlib или игры вы не можете, здесь не приводятся передаваемые значения
и ответы сервера. При необходимости вы сможете найти эту информацию самостоятельно в интернете.
Через authlib
~~~~~~~~~~~~~
.. important :: Эта часть документации описывает запросы, выполняемые через authlib в версии игры 1.7.2+. Для более старых
версий смотрите раздел ниже.
В с е запросы из этой категории выполняются на подуровень /session. Перед каждым из запросов указан тип отправляемого запроса.
.. function :: POST /session/join
Запрос на этот URL производится клиентом в момент подключения к серверу с online-mode=true.
.. function :: GET /session/hasJoined
Запрос на этот URL выполняет сервер с online-mode=true после того, как клиент, пытающийся к нему подключится, успешно
выполнит join запрос.
.. attention :: Внутри тела ответа есть параметр **properties** , который, в свою очередь, содержит поле **value** с
закодированной в ней base64 строкой. В оригинальной системе авторизации данные зашифрованы с помощью
приватного ключа и расшифровывались на клиенте с помощью публичного.
Ely, в свою очередь, **не выполняет шифрацию вовсе** , поэтому вам необходимо отключить проверку подписи в
библиотеке authlib. В противном случае текстуры всегда будут признаваться невалидными.
Для старых версий
~~~~~~~~~~~~~~~~~
.. important :: Эта часть документации описывает запросы, выполняемые более старыми версиями Minecraft, когда не применялась
библиотека authlib. Это все версии, младше версии 1.7.2.
В с е запросы из этой категории выполняются на подуровень /session/legacy. Перед каждым из запросов указан тип отправляемого запроса.
Принцип обработки этих запросов такой же, как и для authlib, отличие только во входных параметрах и возвращаемых значения.
.. function :: GET /session/legacy/join
Запрос на этот URL производится клиентом в момент подключения к серверу с online-mode=true.
.. function :: GET /session/legacy/hasJoined
Запрос на этот URL выполняет сервер с online-mode=true после того, как клиент, пытающийся к нему подключится, успешно
выполнит join запрос.
Важно не потерять GET параметр **?user=** в конце обоих запросов, чтобы получились следующие URL:
`` http://minecraft.ely.by/session/legacy/hasJoined?user= `` .
Одиночная игра
==============
По сути, одиночная игра - это локальный сервер, созданный для одного игрока. По крайней мере это так, начиная с версии 1.6,
в которой и был представлен механизм локальных серверов.
Тем не менее, описанный ниже запрос актуален только для Minecraft 1.7.6+, когда для загрузки скинов стала использоваться
так же authlib.
2015-08-29 00:56:32 +05:30
.. _profile-request:
2015-02-07 01:39:41 +05:30
.. function :: GET /session/profile/{uuid}
Запрос на этот URL выполняется клиентом в одиночной игре на локальном сервере (созданном посредством самой игры).
2015-08-29 00:56:32 +05:30
В URL передаётся UUID пользователя, с которым был запущен клиент, а в ответ получается информация о текстурах игрока
в таком же формате, как и при hasJoined запросе.
2015-02-07 01:39:41 +05:30
Готовые библиотеки authlib
==========================
2021-03-12 16:53:53 +05:30
.. attention :: Ely.by поддрживает библиотеку authlib-injector. Это наиболее простой и универсальный способ установки системы авторизации в игру и игровые сервера. З а подробностями обратитесь в :doc: `соответствующий раздел документации <authlib-injector>` .
2019-12-31 04:25:22 +05:30
Поскольку самостоятельная реализация связана с трудностями поиска исходников, подключения зависимостей и в конце-концов
с процессом компиляции, на `странице загрузок нашей системы скинов <//ely.by/load> `_ вы можете загрузить уже
готовые библиотеки с о всеми необходимыми изменениями. Выберите в выпадающем списке необходимую версию и следуйте
инструкции по установке, размещённой на той же странице ниже.
2015-02-07 01:39:41 +05:30
2019-12-31 04:25:22 +05:30
В более ранних версиях игры система скинов находилась внутри игрового клиента, так что библиотеки ниже обеспечивают
лишь авторизацию:
2015-02-07 01:39:41 +05:30
2021-03-12 16:53:53 +05:30
* Minecraft 1.7.5 - :download: `authlib 1.3.1 <../_static/minecraft-auth/authlib/authlib-1.3.1.jar>`
2015-02-07 01:39:41 +05:30
2021-03-12 16:53:53 +05:30
* Minecraft 1.7.2 - :download: `authlib 1.3 <../_static/minecraft-auth/authlib/authlib-1.3.jar>`
2015-02-07 01:39:41 +05:30
2019-12-31 04:25:22 +05:30
Для установки вам необходимо заменить оригинальную библиотеку, располагающуюся по пути
`` <директория установки minecraft>/libraries/com/mojang/authlib/ `` . Убедитесь в том, что версии скачанного и заменяемого
файлов совпадают.
2015-02-07 01:39:41 +05:30
2021-03-04 17:26:54 +05:30
.. _install-server:
2015-02-07 01:39:41 +05:30
Установка authlib на сервер
2021-03-04 17:26:54 +05:30
===========================
Сервер также использует authlib для выполнения авторизации игрока, поэтому соответствующие изменения должны быть
также применены и к нему. Ниже приведены инструкции по установки authlib для различных реализаций сервера Minecraft.
.. note :: Если ни одна из приведённых ниже инструкций не подошла для вашей реализации сервера, пожалуйста,
создайте `новый issue <https://github.com/elyby/docs/issues/new> `_ и мы допишем инструкцию для вашего сервера.
.. _vanilla:
2015-02-07 01:39:41 +05:30
2021-03-04 17:26:54 +05:30
Оригинальный сервер
~~~~~~~~~~~~~~~~~~~
2015-02-07 01:39:41 +05:30
2021-03-04 17:26:54 +05:30
С помощью архиватора откройте файл сервера `` minecraft_server.ВЕРСИЯ.jar `` . Таким же образом откройте архив с
authlib для соответствующей версии сервера. Перед вами будет два окна: одно с файлами сервера, другое с файлами authlib.
Вам необходимо "перетащить" из архива с authlib все файлы и папки, **за исключением директории META-INF** , и подтвердить
замену.
2015-02-07 01:39:41 +05:30
2021-03-12 16:53:53 +05:30
.. figure :: ../_static/minecraft-auth/authlib-install.png
2015-02-07 01:39:41 +05:30
:align: center
2021-03-12 16:53:53 +05:30
:alt: Процесс установки Authlib
2019-12-31 04:25:22 +05:30
2021-03-04 17:26:54 +05:30
Обратите внимание: "перетягивать" содержимое нужно ниже папок сервера (в область файлов .class).
После этих действий вы можете закрыть о б а окна и в файле `` server.properties `` установить значение `` online-mode=true `` .
Bukkit/Spigot
~~~~~~~~~~~~~
Сперва выполните установку, как она описана для `оригинального сервера <#vanilla> `_ . Затем скачайте библиотеки
`commons-io <https://repo1.maven.org/maven2/commons-io/commons-io/2.5/commons-io-2.5.jar> `_ и
`commons-lang3 <https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5.jar> `_ ,
после чего аналогичным с authlib образом последовательно переместите содержимое скачанных архивов в файлы сервера.
Forge/Sponge
~~~~~~~~~~~~
Прежде чем производить установку, необходимо определить, какой именно файл подлежит модификации:
* **>=1.16** : `` libraries/net/minecraft/server/ВЕРСИЯ-ЦИФРЫ/server-ВЕРСИЯ-ЦИФРЫ-extra.jar `` .
* **1.13-1.15** : `` libraries/net/minecraft/server/ВЕРСИЯ/server-ВЕРСИЯ-extra.jar `` .
* **<=1.12** : `` minecraft_server.ВЕРСИЯ.jar `` .
Когда необходимый файл найден, выполните для него установку authlib, аналогично `оригинальному серверу <#vanilla> `_ .
Paper (PaperSpigot)
~~~~~~~~~~~~~~~~~~~
Установка производится по аналогии с `Bukkit/Spigot <#bukkit-spigot> `_ в файл `` cache/patched-ВЕРСИЯ.jar `` .
После внесения изменений, запускать сервер нужно через jar-файл из директории `` cache `` , поскольку в противном случае
**Paper восстановит исходное состояние файла** :
2019-12-31 04:25:22 +05:30
2021-03-04 17:26:54 +05:30
| До: `` java -jar paper-ВЕРСИЯ-БИЛД.jar ``
| После: `` java -jar cache/patched-ВЕРСИЯ.jar ``
2019-12-31 04:25:22 +05:30
2021-03-10 21:19:06 +05:30
BungeeCord
==========
2015-02-07 01:39:41 +05:30
2021-03-12 16:53:53 +05:30
.. hint :: Вы можете воспользоваться библиотекой :doc: `authlib-injector <authlib-injector>` для установки системы авторизации без модификации внутренностей сервера.
2021-03-10 21:19:06 +05:30
Хотя BungeeCord и является проксирующим сервером, авторизацию игроков он выполняет самостоятельно. К сожалению, BungeeCord не опирается на использование Authlib, а реализует процесс авторизации самостоятельно, поэтому для установки системы авторизации Ely.by вам понадобится модифицировать скомпилированные `` .class `` файлы.
Для установки следуйте инструкции ниже:
#. Скачайте программу InClassTranslator (прямых ссылок не даём, но е г о легко найти).
#. С помощью архиватора откройте файл `` BungeeCord.jar `` .
#. Перейдите по пути `` net/md_5/bungee/connection `` и найдите там файл `` InitialHandler.class `` (без каких-либо символов $).
#. Распакуйте этот файл. В самом простом случае сделать это можно просто "вытянув" е г о из окна архиватора.
#. Откройте распакованный файл в программе InClassTranslator и замените в нём строку `` https://sessionserver.mojang.com/session/minecraft/hasJoined?username= `` на `` https://authserver.ely.by/session/hasJoined?username= `` , как показано на рисунке ниже:
2021-03-12 16:53:53 +05:30
.. figure :: ../_static/minecraft-auth/bungeecord_inclasstranslator.png
2021-03-10 21:19:06 +05:30
:align: center
:alt: Редактирование в InClassTranslator
#. Сохраните изменения и перетащите измененный файл обратно в архив сервера. Подтвердите замену.
2021-03-12 16:53:53 +05:30
.. figure :: ../_static/minecraft-auth/bungeecord_move.png
2021-03-10 21:19:06 +05:30
:align: center
:alt: Перетаскивание отредактированного файла назад в архив
После выполнения этих действий вы можете указать в файле конфигурации BungeeCord (`` config.yml `` ) значение `` online_mode=true `` .
.. important :: Мы также рекомендуем выполнить установку Authlib на все сервера позади BungeeCord. Это может быть необходимо для плагинов, которые используют API Mojang. Инструкция по установке на конечные сервера приведена `выше <#install-server> `_ .
При этом все сервера должны иметь в своей конфигурации (`` server.properties `` ) значение `` online-mode=false `` , поскольку пользователи уже авторизованы силами BungeeCord.
2015-02-07 01:39:41 +05:30
Установка на версии ниже 1.7.2
==============================
Для более старых версий существует достаточно большое многообразие различных случаев, раскрыть которые в этой документации
не представляется возможным. Вся установка заключается в замене определённых строк в определённых классах через
InClassTranslator.
Н а форуме RuBukkit есть отличный пост, в котором собрана вся нужна информация по именам классов на различных версиях
Minecraft. Переписывать е г о сюда не имеет смысла, так что просто перейдите на е г о страницу и найдите нужную версию.
|rubukkit_link|.
.. |rubukkit_link| raw :: html
<a href="http://www.rubukkit.org/threads/spisok-klassov-i-klientov-dlja-mcp.25108/#post-303710" target="_blank">RuBukkit -
Список классов и клиентов для MCP</a>
Пример установки
~~~~~~~~~~~~~~~~
Предположим, что вы хотите установить авторизацию на сервер версии 1.5.2.
Сначала вы переходите по вышепривидённой ссылке, выбираете нужную версию (1.5.2) и видите список классов:
* **bdk.class** - путь до joinserver
* **jg.class** - путь до checkserver
Затем вы должны взять .jar файл клиента и открыть е г о любым архиватором. После чего вам необходимо найти файл **bdk.class** .
Для этого удобно воспользоваться поиском.
После того, как вы нашли файл, е г о нужно извлечь из архива - просто перетащите е г о оттуда в удобную для вас дирикторию.
Дальше запустите InClassTranslator и в нём откройте этот класс. Слева будет список найденных в файле строк, которые вы
можете изменить. Нужно заменить только строку, отвечающую за запрос на подключение к серверу:
2021-03-12 16:53:53 +05:30
.. figure :: ../_static/minecraft-auth/installing_by_inclasstranslator.png
2015-02-07 01:39:41 +05:30
:align: center
2021-03-10 21:19:06 +05:30
:alt: Порядок редактирования: выбрать нужную строку, изменить, сохранить.
2015-02-07 01:39:41 +05:30
После этого вам нужно положить изменённый .class обратно в .jar файл игры.
Т у же самую операцию вам необходимо провести и с сервером, только заменить ссылку на hasJoined.
-----------------------
После этих действий вам нужно в настройках включить online-mode=true и сервер станет пускать на себя только тех игроков,
2015-08-23 22:55:18 +05:30
которые будут авторизованы через Ely.by.