B3-4: Authentication минимум — NextAuth для продуктовых страниц #67

Closed
opened 2026-05-11 20:34:58 +00:00 by lekss361 · 2 comments
lekss361 commented 2026-05-11 20:34:58 +00:00 (Migrated from github.com)

Эшелон: 🎨 Frontend / UX + 🔐 Security

Зачем (КРИТИЧНО ДО ПИЛОТА)

Сейчас admin endpoints защищены X-Admin-Token в localStorage. Продуктовые страницы (/analytics, /recommend, /site-finder) полностью открыты. Пилотный клиент не должен видеть данные конкурентов. Без auth первого пилота заключить нельзя.

Что сделать

NextAuth.js setup

  • Provider: credentials (email + password) или magic link
  • httpOnly cookie вместо localStorage X-Admin-Token

Backend

  • JWT middleware в FastAPI для /api/v1/*
  • Endpoints POST /auth/login, POST /auth/refresh
  • Refresh token rotation

Роли

  • admin — полный доступ
  • pilot — продуктовые страницы, ограничен developer_id
  • demo — read-only с watermark

User schema

CREATE TABLE users (
  id UUID PRIMARY KEY,
  email TEXT UNIQUE NOT NULL,
  password_hash TEXT NOT NULL,  -- argon2
  role TEXT CHECK (role IN ('admin','pilot','demo')),
  developer_id BIGINT,
  created_at TIMESTAMPTZ DEFAULT NOW()
);

Acceptance

  • Логин/logout flow OK
  • /analytics редиректит на /login без cookie
  • Refresh token rotation
  • argon2 (не bcrypt)
  • Audit log

Owner

frontend-engineer (NextAuth + UI) + backend-engineer (JWT + user table)

Effort

~4-5 дней

Open questions

  • Q4: есть уже demo-запросы? Если да → срочно
  • 152-ФЗ: email = ПДн → нужен ToS + согласие
**Эшелон:** 🎨 Frontend / UX + 🔐 Security ## Зачем (КРИТИЧНО ДО ПИЛОТА) Сейчас admin endpoints защищены X-Admin-Token в localStorage. Продуктовые страницы (`/analytics`, `/recommend`, `/site-finder`) **полностью открыты**. Пилотный клиент не должен видеть данные конкурентов. Без auth первого пилота заключить нельзя. ## Что сделать ### NextAuth.js setup - Provider: credentials (email + password) или magic link - httpOnly cookie вместо localStorage X-Admin-Token ### Backend - JWT middleware в FastAPI для `/api/v1/*` - Endpoints `POST /auth/login`, `POST /auth/refresh` - Refresh token rotation ### Роли - `admin` — полный доступ - `pilot` — продуктовые страницы, ограничен developer_id - `demo` — read-only с watermark ### User schema ```sql CREATE TABLE users ( id UUID PRIMARY KEY, email TEXT UNIQUE NOT NULL, password_hash TEXT NOT NULL, -- argon2 role TEXT CHECK (role IN ('admin','pilot','demo')), developer_id BIGINT, created_at TIMESTAMPTZ DEFAULT NOW() ); ``` ## Acceptance - [ ] Логин/logout flow OK - [ ] /analytics редиректит на /login без cookie - [ ] Refresh token rotation - [ ] argon2 (не bcrypt) - [ ] Audit log ## Owner `frontend-engineer` (NextAuth + UI) + `backend-engineer` (JWT + user table) ## Effort ~4-5 дней ## Open questions - Q4: есть уже demo-запросы? Если да → срочно - 152-ФЗ: email = ПДн → нужен ToS + согласие ## Links - Replaces [Auth_Admin_Token](https://obsidian.gendsgn.ru/) decision
Owner

Deferred (2026-05-17): «пока только я использую» (user). Priority понижена priority/highpriority/normal + label blocked (deferred).

Не закрываю — обязательно перед первым пилотом:

  • 🔴 До B2B pilot: prod pages (/analytics, /site-finder, /concept) полностью открыты, admin links exposed в публичной landing → пилотный клиент сразу видит данные конкурентов
  • 🔴 152-ФЗ: email = ПДн → нужен ToS + согласие при login
  • 🟡 X-Admin-Token в localStorage = XSS-уязвимость

Reopen priority когда подпишем первый pilot LOI / появится 2-й пользователь.

Audit reference: audits/issues_audit_2026_05_16.md (2026-05-17).

**Deferred (2026-05-17):** «пока только я использую» (user). Priority понижена `priority/high` → `priority/normal` + label `blocked` (deferred). Не закрываю — обязательно перед первым пилотом: - 🔴 До B2B pilot: prod pages (`/analytics`, `/site-finder`, `/concept`) **полностью открыты**, admin links exposed в публичной landing → пилотный клиент сразу видит данные конкурентов - 🔴 152-ФЗ: email = ПДн → нужен ToS + согласие при login - 🟡 X-Admin-Token в localStorage = XSS-уязвимость Reopen priority когда подпишем первый pilot LOI / появится 2-й пользователь. Audit reference: `audits/issues_audit_2026_05_16.md` (2026-05-17).
Owner

Status check 2026-05-23 — superseded by PRs #426 / #437 / #442

NextAuth.js / JWT в FastAPI больше не нужен для pilot scope. Сегодня сделан security pivot — переход на Caddy basic_auth gate перед всем gendsgn.ru:

  • PR #426 (cc2d148) — Caddy basic_auth на 11 pilot users (admin, user1..user10).
  • PR #437 (b233bf9) — убран X-Admin-Token (AdminTokenAuth) из 47 admin endpoints в 6 файлах backend. Защита теперь полностью на edge через Caddy.
  • PR #442 (a2953e9) — удалён Admin Token UI input на фронте + fix enabled: !!token (был critical bug, новые users без token видели «Загрузка...» навсегда).
  • PRs #430 / #432 / #436 — GlitchTip auth forwarder + log_credentials + auth_audit.log → 401 events в Sentry содержат IP / UA / attempted_username.

NextAuth с JWT / user-table / argon2 / refresh-rotation — overkill для pilot 11 users. Если в Раунде A нужно будет multi-tenant (per-developer scope, role=pilot/demo), задача воскреснет уже как отдельный epic — но текущий issue устарел.

Closing as superseded.

## Status check 2026-05-23 — superseded by PRs #426 / #437 / #442 NextAuth.js / JWT в FastAPI больше не нужен для pilot scope. Сегодня сделан security pivot — переход на **Caddy basic_auth gate** перед всем `gendsgn.ru`: - PR #426 (`cc2d148`) — Caddy `basic_auth` на 11 pilot users (`admin`, `user1..user10`). - PR #437 (`b233bf9`) — убран `X-Admin-Token` (`AdminTokenAuth`) из 47 admin endpoints в 6 файлах backend. Защита теперь полностью на edge через Caddy. - PR #442 (`a2953e9`) — удалён Admin Token UI input на фронте + fix `enabled: !!token` (был critical bug, новые users без token видели «Загрузка...» навсегда). - PRs #430 / #432 / #436 — GlitchTip auth forwarder + `log_credentials` + `auth_audit.log` → 401 events в Sentry содержат IP / UA / `attempted_username`. NextAuth с JWT / user-table / argon2 / refresh-rotation — overkill для pilot 11 users. Если в Раунде A нужно будет multi-tenant (per-developer scope, role=`pilot`/`demo`), задача воскреснет уже как отдельный epic — но текущий issue устарел. Closing as superseded.
Sign in to join this conversation.
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#67
No description provided.