Hosted-сервис, который на старте, когда EffectivelyEnabled=true, создаёт:
- организацию «Демо-магазин» (отдельная от «Demo Market» DevDataSeeder'а,
чтобы не ломать e2e, завязанные на DemoMarket);
- tenant references через существующий SeedTenantReferencesAsync (единицы,
магазин, PriceType, системные роли);
- каталог демо-товаров через DemoTenantSeeder (50 товаров + 30 продаж +
приёмки/контрагенты) — идемпотентно, маркер DEMO-*;
- три учётки с ролями Admin/Cashier/Storekeeper:
demo-admin@food-market.local
demo-cashier@food-market.local
demo-keeper@food-market.local
(пароль Admin12345!, но мастер-пароль 123456 тоже подойдёт — через
QuickLoginOptions в AuthorizationController).
На проде (EffectivelyEnabled=false) сервис тихо выходит в StartAsync —
ничего не трогает, ничего не логирует.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
4.9 KiB
4.9 KiB
Quick Login — прогресс
Задача владельца: на test.admin.food-market.kz не набирать логин/пароль руками.
Выбрать аккаунт из списка, пароль у всех один — 123456. На admin.food-market.kz
этого нет никогда (несколько независимых предохранителей).
Координатор отдельно проверил: на стейдже нет реальных секретов (МойСклад токенов нет, ОФД-ключей нет, Telegram не привязан, SMTP пустой) — потому открытый мастер-пароль на стенде безопасен.
Чек-лист
- 1. Флаг конфигурации —
QuickLogin:Enabled(default false) +QuickLogin:MasterPassword(default123456). Включается только через env-переменныеQuickLogin__Enabled=trueв stage-compose. Жёсткий предохранитель: еслиOpenIddict:Issuerуказывает на admin.food-market.kz — быстрый вход принудительно выключен и в лог Warning. - 2. Мастер-пароль — password-grant:
QuickLogin:MasterPasswordработает как второй вход рядом со своим паролем. Неактивные/без-org пользователи — отшиваются как раньше. Rate-limit не ослаблять. - 3. API списка аккаунтов —
GET /api/dev/quick-login/accounts(анонимный, 404 если выключен). Порядок: SuperAdmin → демо-* → остальные «человеческие». Autotest-патéрны (cat31-, visual-, factory-smoke-, mt6, quality-, i18n-, auth2-, doc4-, rep5-, rt8-, twofa-, wiz9-, a11y-, mob1*-, isoB-, axdet-, smoke-, ratetest-, perf-, probe-, load-, s19-test- и всё с суффиксом из ≥10 цифр) — скрыты. Лимит 50 +?q=. - 4. Демо-аккаунты — идемпотентный сид «Демо-магазин» (через
существующий
DemoTenantSeeder) + сотрудники с ролями Admin / Cashier / Storekeeper (demo-admin@food-market.local,demo-cashier@...,demo-keeper@...). Запускается только при Enabled=true. - 5. Страница входа (web) — если
GET .../accountsвернул 200 — над обычной формой блок «Быстрый вход (тестовый стенд)» с карточками + поиск. Клик — моментальный логин через мастер-пароль. На проде блока нет. - 6. Плашка «ТЕСТОВЫЙ СТЕНД» — при Enabled=true жёлтая полоса
сверху +
<meta robots="noindex,nofollow">в index.html стенда. - 7. Чистка автотестового мусора — SQL-скрипт для стейджа + расширение
HousekeepingJobs.PruneQualityTestOrgsAsyncна новые autotest-патéрны, чтобы cron 02:30 UTC гасил новые юзеры сам. Не трогать: SuperAdmin, admin@demo-market.local, market@email.com, demo-* аккаунты. - 8. Тесты — integration (3): Enabled=false → эндпоинт 404 + мастер-
пароль отвергается; Issuer=admin.food-market.kz → выключен даже с
Enabled=true; Enabled=true → мастер-пароль пускает активного и не пускает
неактивного. E2E stage: клик по демо-кассиру → меню кассира. Прод:
curl https://admin.food-market.kz/api/dev/quick-login/accounts→ 404. - 9. Деплой + документация — поднять env в stage-compose
(локальный репо + prod-vm
~/food-market-stage/deploy/docker-compose.yml),~/deploy-stage.sh, ретест,docs/quick-login.md.
Правила (сам себе)
- Мастер-пароль и список аккаунтов — никогда не на проде. По умолчанию выключено, Issuer=admin.* — выключено независимо от флага.
- После каждого пункта: build + соответствующие тесты + коммит порцией +
[x]в этом файле. - Не трогать: прод admin.food-market.kz (кроме read-only проверки 404),
global.json, POS WPF, gateway nginx.
Условие остановки
9 пунктов [x], тесты зелёные, стейдж задеплоен, прод-эндпоинт 404 →
итог в этом файле + touch ~/.fm-watchdog/DONE.