# Эксплуатация 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 подряд и убедиться, что работает только второй.