go-learn/docs/plans/plan-phase-8-1.md
sab.code.lab 1c85091186 chore: восстановление репозитория из снапшота v0.3.1
Прежняя git-история утрачена при переносе проекта на машину владельца
(снапшот без .git). Хэши коммитов в docs/reports/* относятся к утраченной
истории.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-07 09:34:02 +02:00

47 lines
3 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.

# План этапа 8.1 — регистрация отдельной страницей, восстановление пароля, капча
Дата: 2026-08-06. Статус: завершён (467/467 + smoke 58 OK). Предшественник: этап 8 завершён,
main = 7da814c (461/461 + smoke OK). Решения владельца: своя автономная
капча; OAuth — позже (дизайн docs/design/oauth-vk-yandex.md).
## Ключевые решения (не пере-решать)
1. Регистрация — ОТДЕЛЬНАЯ страница /register.html (не модалка): проще,
доступнее (a11y), диплинкабельна. /account.html становится страницей
входа со ссылками «Нет аккаунта? Зарегистрируйтесь» и «Забыли
пароль?».
2. Капча — автономная SVG (БЕЗ GD): glyph-повроты + шумовые кривые;
код в сессии (sha256, 10 мин), одноразовая; только на регистрации
(login прикрыт rate limit). SVG выбран вместо GD: GD не везде есть
на хостингах, а локальный рантайм из deb — тем более.
3. Восстановление — токен 1 час, sha256 в БД, request всегда 200 (нет
enumeration), сбой mail() → 503; тестовый режим GOLEARN_TEST=1:
письмо в файл, капча-код в заголовке X-Captcha-Debug.
4. Параллельные ветки: stage-8-1-server (эндпоинты + миграция
password_resets + smoke) и stage-8-1-web (страницы + строки);
зоны не пересекаются. Мерж: server → web.
## Объём
- server/: api/captcha.php, api/password-reset/request.php,
api/password-reset/confirm.php; register.php += captcha; миграция
password_resets; config.example.php += base_url, mail_from;
smoke.sh += сценарии капчи и восстановления.
- apps/web: pages/register.html, pages/password-reset.html (два
режима по query), правки account.astro (ссылки), sync-client.ts
+= requestPasswordReset/confirmPasswordReset + captcha в register,
strings.ts.
- docs/deploy.md += шаги: проверка mail() (тестовое письмо), base_url
в config.php.
## Приёмка
- npm run gates зелёные; smoke.sh (с новыми сценариями) зелёный
локально; astro build PASS (18 страниц).
## Риски
- Доставляемость mail() с shared-хостинга (SPF/DKIM) — ручная проверка
владельцем на деплое; риск в PROJECT_STATE.
- SVG-капча слабее GD/сервисной к OCR-ботам — для учебного сайта
приемлемо; при злоупотреблениях — Yandex SmartCaptcha через ADR.