wip
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
# Эксплуатация launcher-авторизации
|
||||
|
||||
Нормативный протокол описан в
|
||||
[`LauncherAuthorizationContract.md`](LauncherAuthorizationContract.md). Этот
|
||||
документ относится к реализованной в данном репозитории серверной части.
|
||||
|
||||
## Что входит в репозиторий
|
||||
|
||||
- `authserver` использует временные SRP salt/verifier для всех обычных
|
||||
аккаунтов и не делает fallback на постоянный пароль;
|
||||
- SQL update `2026_08_16_00.sql` добавляет активные ticket, журнал погашений,
|
||||
точный IP allowlist для dev-аккаунтов и provenance session key;
|
||||
- `issue-launcher-ticket.sh` является reference adapter для backend и локальной
|
||||
интеграции. Production backend должен реализовать ту же операцию внутри
|
||||
своего доверенного процесса, включая аутентификацию launcher session и rate
|
||||
limiting;
|
||||
- reconnect и вход в worldserver разрешены только session key с provenance
|
||||
`launcher` или `dev`.
|
||||
|
||||
Исходников MoonWell Launcher, MoonWell.dll, GlueXML и backend в этом
|
||||
репозитории нет. Их реализация должна следовать отдельным разделам контракта.
|
||||
|
||||
## Выпуск ticket
|
||||
|
||||
База должна быть запущена и обновлена штатным `ac-db-import`:
|
||||
|
||||
```bash
|
||||
./issue-launcher-ticket.sh PLAYER --build 12340 --ttl 60
|
||||
```
|
||||
|
||||
Успешный результат — одна JSON-строка в stdout. Она содержит plaintext ticket
|
||||
и должна быть сразу передана launcher по TLS с `Cache-Control: no-store`.
|
||||
Диагностика выводится в stderr. Новый вызов для того же account атомарно
|
||||
заменяет предыдущую активную generation.
|
||||
|
||||
Скрипт не является публичным HTTP endpoint. Нельзя предоставлять игрокам
|
||||
доступ к его запуску или к MySQL credentials.
|
||||
|
||||
## Dev allowlist
|
||||
|
||||
Постоянный verifier используется только при совпадении account и точного
|
||||
remote IP с активной строкой allowlist:
|
||||
|
||||
```sql
|
||||
INSERT INTO launcher_dev_account (account_id, allowed_ip, comment)
|
||||
SELECT id, '10.20.30.40', 'local developer over VPN'
|
||||
FROM account
|
||||
WHERE username = 'DEVACCOUNT'
|
||||
ON DUPLICATE KEY UPDATE enabled = 1, comment = VALUES(comment);
|
||||
```
|
||||
|
||||
Отключение:
|
||||
|
||||
```sql
|
||||
UPDATE launcher_dev_account
|
||||
SET enabled = 0
|
||||
WHERE account_id = (SELECT id FROM account WHERE username = 'DEVACCOUNT')
|
||||
AND allowed_ip = '10.20.30.40';
|
||||
```
|
||||
|
||||
CIDR и wildcard намеренно не поддерживаются: allowlist требует точного IP.
|
||||
|
||||
## Миграция и откат
|
||||
|
||||
SQL update очищает существующие `account.session_key`, чтобы legacy reconnect
|
||||
не обходил launcher-only политику. После применения старые клиенты должны
|
||||
получить новый launcher ticket.
|
||||
|
||||
Миграция безопасности намеренно не имеет автоматического fallback. Перед
|
||||
развёртыванием должны быть готовы backend issuer и Release-клиент. Для
|
||||
аварийного dev-доступа заранее добавьте только выделенный account и VPN IP в
|
||||
`launcher_dev_account`.
|
||||
|
||||
## Проверка
|
||||
|
||||
После сборки и применения update:
|
||||
|
||||
1. выпустить ticket для тестового account;
|
||||
2. убедиться, что прямой вход со старым паролем отвергнут;
|
||||
3. войти с ticket;
|
||||
4. убедиться, что строка удалена из `launcher_ticket` и появилась в
|
||||
`launcher_ticket_consumption`;
|
||||
5. повторить вход с тем же ticket и получить отказ;
|
||||
6. выпустить два ticket подряд и убедиться, что работает только второй.
|
||||
Reference in New Issue
Block a user