Вход без пароля, права админа и F3+B

Аутентификация переделана по схеме пользователя: лаунчер — единственный
источник токена, сервер проверяет его сам и лаунчера не спрашивает.

- rsx-auth/GameToken: токен это base64url(payload) + "." + base64url(HMAC-SHA256),
  payload {uuid, nick, aud, exp, jti, typ}, typ = session или reload.
- Сессия живёт час, reload-токен полтора часа и только внутри игры. Пакет
  SessionReload продлевает сессию и выдаёт новый reload-токен.
- Сервер проверяет подпись, аудиенс, срок и совпадение uuid. HTTP-запрос к
  лаунчеру из сервера убран.
- Клиент: окно пароля убрано совсем, ник берётся из токена, клиент сам
  продлевает сессию за 5 минут до конца.
- Для локальной разработки сервер с --dev-token пишет свой токен в
  world/dev-token.txt, клиент берёт токен оттуда.
- Права админа: свой список world/admins.txt, перечитывается раз в 5 секунд,
  поэтому право снимается на лету. Пакет AdminState.
- Ванильные блоки мира ломает только админ, режим игры прав не даёт.
- F3+B только для админов: без прав показываем отказ, с правом включаются и
  ванильные хитбоксы, и наш отладочный рендер. Права сняли посреди просмотра —
  гаснут сразу.
- run-game.ps1 умеет -Token.

Проверено на живом сервере: own session ok, player in, rights of Player given.
Тесты: протокол 34, сервер 88, форк собирается чисто.
This commit is contained in:
sasheg dev
2026-10-22 08:50:57 +03:00
parent cf90f71e58
commit d2a0a7a93b
21 changed files with 1478 additions and 543 deletions
+46 -1
View File
@@ -817,7 +817,52 @@ MovementInputFromOptions` и `RsxPlayerTuning` с числами.
регистрирует свои коробки.
- Область: наши структуры (узлы, мусорка, постройки) и игроки с зонами.
### 2.11 Декомпил ремейка лежит на диске
### 2.11 Вход без пароля (сделано)
**Схема пользователя — её нельзя менять:**
> 1. Лаунчер при заходе предлагает войти. Он обращается к **AUTH-серверу**: есть ли
> доступ к игре у этого пользователя. Нет — идёт нахер. Да — пропускает.
> 2. При запуске игры лаунчер передаёт игре **токен** и **uuid (без ника)**; ник игра
> получает из токена+uuid.
> 3. Игра интерпретирует и проверяет токен, и при заходе на сервер передаёт **наш
> uuid и личный токен** (полученный **только для этого сервера**).
> 4. Сервер проверяет валидность uuid+личного токена **сам** и, если ок, пускает в игру.
> **Сервер лаунчер не спрашивает. Ролей от лаунчера не получаем.**
> 5. **Внутри игры пароля нет и логин-окна быть не должно.**
> 6. Если сессия просрочилась в игре — **reload-token** продлевает сессию на час, сам
> reload-token живёт 1.5 часа. Он **только внутри игры** и не влияет на reload-token
> аккаунта (чтобы не логиниться в лаунчер каждый раз).
**Что сделано у нас:**
- **Токен**: `base64url(payload).base64url(HMAC-SHA256(payload))`, payload =
`{uuid, nick, aud, exp, jti, typ}`; `typ` = `session` | `reload`. Ключ — в конфиге
сервера (`--token-key`), общий с auth-сервером. Класс `rsx-auth/GameToken`.
- **Сессия**: 1 час. **Reload-токен**: 1.5 часа, выдаётся вместе с сессией;
пакет `SessionReload` → продление на час + новый reload-токен.
- **Сервер** проверяет подпись, аудиенс (свой сервер), срок и совпадение uuid — сам,
без обращения к лаунчеру. HTTP-запрос `/auth/validate` из сервера убран.
- **Клиент**: окно ввода пароля **убрано совсем** (нет ни полей, ни кнопки Connect);
ник берётся из токена; клиент сам перезапрашивает сессию за 5 минут до конца.
- **Для локальной разработки**: сервер с `--dev-token <аккаунт>` выдаёт свой токен и
пишет его в `<world>/dev-token.txt`; клиент берёт токен оттуда.
### 2.12 Права админа и F3+B (сделано)
- **Список — свой, у сервера**: `<world>/admins.txt` (по строке на аккаунт),
перечитывается каждые 5 секунд → **права снимаются на лету**. Лаунчер про роли
ничего не сообщает.
- Пакет `AdminState` — сервер шлёт при входе и при каждом изменении.
- **Ванильные блоки мира ломает только админ** (режим игры прав не даёт) — правило
п. 2.3.
- **F3+B — только для админов.** Без прав показывается «only an administrator may look
at the boxes». Наш отладочный рендер (`/rsx hitboxes`) включается тем же F3+B.
Права сняли посреди просмотра → и ванильные хитбоксы, и наш рендер гаснут сразу.
- Отладочный рендер показывает и коробки структур, и зоны игрока (голова красная,
тело жёлтое, ноги синие), и области LOD.
### 2.13 Декомпил ремейка лежит на диске
`G:\src-decoded` (5207 файлов, строки расшифрованы), также `G:\src`,
`G:\builds\v31\src{,-decoded}` и `G:\decompiled-rustex`. Это **исходники клиента