Введение
В этой статье мы разберём как работает протокол авторизации YGGDRASIL, который широко используется в играх компании Mojang, как пример Minecraft. YggDrasil — это сетевой протокол который позволяет создать приватную сеть в которой передаваемая информация надёжно защищена от других участников соединения.
Как оно работает?
В данной системе авторизации нет ничего сложного сейчас мы разберём схему на примере того как она работает в Minecraft
В примере с видеоигрой Minecraft мы можем лицезреть, что у нас используется два сервера один игровой другой сервер авторизации. В начале этой схемы клиент посылает на сервер авторизации своё имя пользователя и пароль, далее происходит проверка на существование аккаунта и дальнейшая сверка пароля с тем который хранится у нас на сервере.
Если всё сошлось ты отправляем обратно клиенту его уникальный ключ авторизации (accessToken) и уникальный номер (UUID, зачастую это md5 хэш имени пользователя или электронной почты), по которому мы будем в дальнейшем авторизоваться на наш игровой сервер. После мы пытаемся зайти на сам игровой сервер, во время процедуры входа — игровой сервер отправляет запрос на сервер авторизации с вопросом знает ли он этого пользователя (запрос связанный с accessToken и serverId).
В случае если всё сошлось то мы впускаем игрока на игровой сервер.
Ничего не понятно? Идём дальше
Как работает понял, а как на практике?
В случае Minecraft'ом существует два запроса:
Отправляем POST запрос со следующими параметрами и с заголовком Content-Type: application/json.
- accessToken
- selectedProfile
- serverId
Запрос будет иметь:
{
"accessToken": "<accessToken>",
"selectedProfile": "<player's uuid without dashes>",
"serverId": "<serverHash>"
}
Отправляем GET запрос со следующими параметрами.
- username
- serverId
Пример запроса:
https://sessionserver.mojang.com/minecraft/hasJoined?username=name&serverId=hash
Соответственно сервер вернёт нам ответ в виде профиля игрока:
{
"id": "<profile identifier>",
"name": "<player name>",
"properties": [
{
"name": "textures",
"value": "<base64 string>",
"signature": "<base64 string; signed data using private key>"
} ]
}