food-market/docs/quick-login-progress.md
nns 6582333def feat(s30): QuickLoginBlock + интеграция в LoginPage (шаг 5/9)
Над обычной формой логина теперь висит жёлтый блок «Быстрый вход
(тестовый стенд)»: клик по карточке → моментальный логин через
мастер-пароль 123456 (сохранён как константа в LoginPage.tsx — должен
совпадать с server-side QuickLoginOptions.MasterPassword).

Блок сам опрашивает /api/dev/quick-login/accounts: 200 → рендерится,
404 (= прод) → возвращает null, НИЧЕГО не рисует. Так одним и тем же
web-билдом покрываются и стенд, и прод — секрета в UI нет.

Поиск: ?q= на сервере (debounced 200ms), фильтрует по email/ФИО/роли/
магазину. Карточки с badge SuperAdmin / Демо. Lazy-рендер, max-h-80
с overflow-y чтобы не ломать компоновку.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-10-04 15:41:50 +05:00

62 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Quick Login — прогресс
Задача владельца: на `test.admin.food-market.kz` не набирать логин/пароль руками.
Выбрать аккаунт из списка, пароль у всех один — `123456`. На `admin.food-market.kz`
этого нет никогда (несколько независимых предохранителей).
Координатор отдельно проверил: на стейдже нет реальных секретов (МойСклад
токенов нет, ОФД-ключей нет, Telegram не привязан, SMTP пустой) — потому
открытый мастер-пароль на стенде безопасен.
## Чек-лист
- [x] 1. **Флаг конфигурации** — `QuickLogin:Enabled` (default false) +
`QuickLogin:MasterPassword` (default `123456`). Включается только через
env-переменные `QuickLogin__Enabled=true` в stage-compose. Жёсткий
предохранитель: если `OpenIddict:Issuer` указывает на admin.food-market.kz —
быстрый вход принудительно выключен и в лог Warning.
- [x] 2. **Мастер-пароль** — password-grant: `QuickLogin:MasterPassword`
работает как второй вход рядом со своим паролем. Неактивные/без-org
пользователи — отшиваются как раньше. Rate-limit не ослаблять.
- [x] 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=`.
- [x] 4. **Демо-аккаунты** — идемпотентный сид «Демо-магазин» (через
существующий `DemoTenantSeeder`) + сотрудники с ролями Admin / Cashier /
Storekeeper (`demo-admin@food-market.local`, `demo-cashier@...`,
`demo-keeper@...`). Запускается только при Enabled=true.
- [x] 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`.