Lean A3a — auth-kern: intrekbare sessies, apparaat-token, proxy en login-rem #82

Merged
janpeter merged 24 commits from feat/lean-a3a-auth-kern into main 2026-09-20 20:27:24 +02:00
Owner

Samenvatting

Eerste helft van Lean A3 (auth). Elke controle — API-route, pagina en server action — leest de Session-rij, zodat intrekken op het eerstvolgende verzoek werkt.

  • Eén toegangspunt authenticateRequest (src/lib/auth/): Bearer, Basic alleen op GET/HEAD, of de iron-session-cookie; header wint van cookie; store-fout → 503, nooit 401 en nooit toegang.
  • Wikkels protectedAction / protectedPage; een gesloten vorm- en inventariscontrole over heel src dwingt af dat elke action en pagina gewikkeld is (src/test/guard-ast.ts, page-action-guard.test.ts).
  • Proxy: safeNextPath, CSRF-regel (Bearer zonder cookie overgeslagen, muterend Basic 403), schuivende cookie (seal 32 d, rij dwingt 30 d af, herzegelen hooguit eens per 24 u, niet op publieke paden).
  • Rem op logins: 5 vrije pogingen, daarna 1–60 s; hooguit 2 lopende / 8 wachtende wachtwoordvergelijkingen; prune na geslaagde login.
  • Eén additieve migratie 20260922000000_lean_a3_auth (Session-kolommen + device_pairing); bestaande sessies blijven geldig.
  • Runbook docs/runbooks/lean-a3a-auth-kern-deploy.md en de sectie "Auth (lean A3a)" in CLAUDE.md.

Buiten scope (A3b): pairing-flow, /setup, /account, wachtwoordbeleid, verwijderen van /users* en create-admin, alleen-LAN-runbook.

Herkomst

  • Spec: docs/superpowers/specs/2026-09-20-lean-a3-auth-design.md (revisie 3, dubbele GO, errata E1–E9).
  • Plan: docs/superpowers/plans/2026-09-20-lean-a3a-auth-kern.md (revisie 6, dubbele GO na zes reviewrondes door mac:codex en scrum4me-server:claude; Review record onderaan). De zes patches naast het plan zijn toegepast; de codeboom na taak 6 is identiek aan de referentie-implementatie.
  • Task 8 (fix(auth): proxy herzegelt niet op publieke paden) is ná de GO toegevoegd met akkoord van JP en is niet door de reviewers beoordeeld; het lost de MINOR uit ronde 6 op.
  • Scrum4Me: sprint S-2026-09-20-2, PBI-21, T-176..T-183.

Verificatie (lokaal, macOS)

  • Volledige suite: 674 tests, 667 pass, 0 fail, 7 skipped (dezelfde 7 Linux-only tests als vóór A3).
  • typecheck, lint (0 errors, 3 bestaande warnings), build groen; server-reference-manifest.json bevat de gewikkelde actions.
  • Mutatiechecks uit het plan maakten de genoemde tests rood (taak 3: 2, taak 4: 7, taak 5: 1) en zijn teruggezet.
  • deploy/media-organizer.env.sops en de baseline-migratie zijn onaangeroerd.

Open gates — niet door een agent

  • De runbook-commando's zijn niet tegen een draaiend systeem uitgevoerd.
  • Rooktest in de gebouwde image (runbook §1a/§1b), migratie op productie en deploy: elk aparte toestemming van JP.
  • Terugrol-artefact (runbook §0) moet door JP vooraf worden klaargezet; terugrol alleen fail-closed met een nieuw SESSION_SECRET.

🤖 Generated with Claude Code

## Samenvatting Eerste helft van Lean A3 (auth). Elke controle — API-route, pagina en server action — leest de `Session`-rij, zodat intrekken op het eerstvolgende verzoek werkt. - Eén toegangspunt `authenticateRequest` (`src/lib/auth/`): Bearer, Basic alleen op GET/HEAD, of de iron-session-cookie; header wint van cookie; store-fout → 503, nooit 401 en nooit toegang. - Wikkels `protectedAction` / `protectedPage`; een gesloten vorm- en inventariscontrole over heel `src` dwingt af dat elke action en pagina gewikkeld is (`src/test/guard-ast.ts`, `page-action-guard.test.ts`). - Proxy: `safeNextPath`, CSRF-regel (Bearer zonder cookie overgeslagen, muterend Basic 403), schuivende cookie (seal 32 d, rij dwingt 30 d af, herzegelen hooguit eens per 24 u, niet op publieke paden). - Rem op logins: 5 vrije pogingen, daarna 1–60 s; hooguit 2 lopende / 8 wachtende wachtwoordvergelijkingen; prune na geslaagde login. - Eén additieve migratie `20260922000000_lean_a3_auth` (Session-kolommen + `device_pairing`); bestaande sessies blijven geldig. - Runbook `docs/runbooks/lean-a3a-auth-kern-deploy.md` en de sectie "Auth (lean A3a)" in `CLAUDE.md`. Buiten scope (A3b): pairing-flow, `/setup`, `/account`, wachtwoordbeleid, verwijderen van `/users*` en `create-admin`, alleen-LAN-runbook. ## Herkomst - Spec: `docs/superpowers/specs/2026-09-20-lean-a3-auth-design.md` (revisie 3, dubbele GO, errata E1–E9). - Plan: `docs/superpowers/plans/2026-09-20-lean-a3a-auth-kern.md` (revisie 6, dubbele GO na zes reviewrondes door `mac:codex` en `scrum4me-server:claude`; Review record onderaan). De zes patches naast het plan zijn toegepast; de codeboom na taak 6 is identiek aan de referentie-implementatie. - Task 8 (`fix(auth): proxy herzegelt niet op publieke paden`) is ná de GO toegevoegd met akkoord van JP en is **niet** door de reviewers beoordeeld; het lost de MINOR uit ronde 6 op. - Scrum4Me: sprint S-2026-09-20-2, PBI-21, T-176..T-183. ## Verificatie (lokaal, macOS) - Volledige suite: 674 tests, 667 pass, 0 fail, 7 skipped (dezelfde 7 Linux-only tests als vóór A3). - `typecheck`, `lint` (0 errors, 3 bestaande warnings), `build` groen; `server-reference-manifest.json` bevat de gewikkelde actions. - Mutatiechecks uit het plan maakten de genoemde tests rood (taak 3: 2, taak 4: 7, taak 5: 1) en zijn teruggezet. - `deploy/media-organizer.env.sops` en de baseline-migratie zijn onaangeroerd. ## Open gates — niet door een agent - De runbook-commando's zijn **niet** tegen een draaiend systeem uitgevoerd. - Rooktest in de gebouwde image (runbook §1a/§1b), migratie op productie en deploy: elk aparte toestemming van JP. - Terugrol-artefact (runbook §0) moet door JP vooraf worden klaargezet; terugrol alleen fail-closed met een nieuw `SESSION_SECRET`. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
docs(auth): runbook en documentregels voor de auth-kern (A3a)
All checks were successful
CI / test (historical-bootstrap) (pull_request) Successful in 1m7s
CI / test (video-migration) (pull_request) Successful in 1m5s
CI / test (suite) (pull_request) Successful in 3m29s
CI / docker-build (pull_request) Successful in 2m45s
2341226848
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
s4m-codex-reviewer left a comment

APPROVED

Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.

Findings

  • Geen blokkerende of error-severity findings gevonden.

Review-notities

De diff volgt de relevante productstandaarden die ik heb getoetst: de proxy blijft in src/proxy.ts met named proxy, houdt CSRF/CSP/auth-redirects centraal, en de nieuwe auth-laag laat pagina's/actions via protectedPage/protectedAction lopen terwijl API-routes via requirePrincipal een rij-gebaseerde sessiecontrole doen. De /api/s4m-uitzondering blijft cookie-only via copilotRequireSession, wat past bij de eis dat apparaat-tokens daar niet geldig zijn. Tests en guard-tests zijn uitgebreid rond sessie-intrekking, device-tokenregels, CSRF, safe next-paths en pagina/action-vormcontrole.

# APPROVED Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden. ## Findings - Geen blokkerende of error-severity findings gevonden. ## Review-notities De diff volgt de relevante productstandaarden die ik heb getoetst: de proxy blijft in `src/proxy.ts` met named `proxy`, houdt CSRF/CSP/auth-redirects centraal, en de nieuwe auth-laag laat pagina's/actions via `protectedPage`/`protectedAction` lopen terwijl API-routes via `requirePrincipal` een rij-gebaseerde sessiecontrole doen. De `/api/s4m`-uitzondering blijft cookie-only via `copilotRequireSession`, wat past bij de eis dat apparaat-tokens daar niet geldig zijn. Tests en guard-tests zijn uitgebreid rond sessie-intrekking, device-tokenregels, CSRF, safe next-paths en pagina/action-vormcontrole.
Sign in to join this conversation.
No reviewers
No labels
No milestone
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
janpeter/Media-Organizer!82
No description provided.