feat(auth): cross-app QR-login voor scrum4me-workers #50

Merged
janpeter merged 13 commits from feat/qr-cross-app-login into main 2026-06-15 14:23:44 +02:00
Owner

Doel

QR-login voor scrum4me-workers (naast wachtwoord): scan op /login met een telefoon die in scrum4me-web is ingelogd → de workers-desktop krijgt een admin-sessie. Cross-app, purely additive.

Aanpak

Workers maakt een LoginPairing(pending) in de gedeelde Postgres; de telefoon keurt goed via scrum4me-web's bestaande /m/pair (ongewijzigd); de workers-desktop pollt GET /api/auth/pair/status en claimt via POST /api/auth/pair/claim. De security-grens ligt volledig in de claim: transactioneel rol-check (niet-demo + ADMIN) vóór de atomic consume → mint s4m_workers_session.

Wat is toegevoegd (additief)

  • lib/auth/pairing.ts (sha256-crypto, cross-app parity), lib/auth/pair-cookie.ts (s4m_pair)
  • WEB_APP_BASE_URL env (gevalideerd, default https://thuis.jp-visser.nl)
  • IP-rate-limit voor pair-start; proxy laat /api/auth/pair/* anoniem door
  • routes start / status (geen data-lek) / claim (admin/demo-gate)
  • desktop QR-UI op /login (poll → claim), MD3-styling

Reviews & gates

  • Ontwerp door codex gereviewd (NO-GO → alle punten verwerkt: proxy-allowlist, transactionele gate, IP-rate-limit, status zonder leak, deploy-gate).
  • Shared-DB deploy-gate GROEN geverifieerd op scrum4me-srv (web + workers = scrum4me-postgres, DB scrum4me).
  • Onafhankelijke adversariële security-review van de claim-gate: APPROVED (alle 6 garanties).
  • Finale integratie-review: APPROVED.
  • npm run verify groen: 571 passed, 2 skipped (90 files).

Geen

  • Geen wijziging aan scrum4me-web. Geen Prisma-migratie. Geen wijziging aan vendor/scrum4me-shared.

Deploy

  • Nieuwe env WEB_APP_BASE_URL (default volstaat voor thuis.jp-visser.nl; override in /srv/scrum4me/secrets/workers.env indien nodig).
  • Handmatige e2e-rookproef (telefoon ingelogd op WEB_APP_BASE_URL) is een post-deploy check.

Spec/plan: docs/superpowers/{specs,plans}/2026-06-15-cross-app-qr-login*.md. Scrum4Me: Sprint S-2026-06-15-1, PBI-9, Story ST-012, taken T-32…T-42.

🤖 Generated with Claude Code

## Doel QR-login voor scrum4me-workers (naast wachtwoord): scan op `/login` met een telefoon die in scrum4me-web is ingelogd → de workers-desktop krijgt een admin-sessie. **Cross-app, purely additive.** ## Aanpak Workers maakt een `LoginPairing(pending)` in de gedeelde Postgres; de telefoon keurt goed via scrum4me-web's bestaande `/m/pair` (**ongewijzigd**); de workers-desktop pollt `GET /api/auth/pair/status` en claimt via `POST /api/auth/pair/claim`. De security-grens ligt volledig in de claim: transactioneel **rol-check (niet-demo + ADMIN) vóór** de atomic consume → mint `s4m_workers_session`. ## Wat is toegevoegd (additief) - `lib/auth/pairing.ts` (sha256-crypto, cross-app parity), `lib/auth/pair-cookie.ts` (`s4m_pair`) - `WEB_APP_BASE_URL` env (gevalideerd, default `https://thuis.jp-visser.nl`) - IP-rate-limit voor `pair-start`; proxy laat `/api/auth/pair/*` anoniem door - routes `start` / `status` (geen data-lek) / `claim` (admin/demo-gate) - desktop QR-UI op `/login` (poll → claim), MD3-styling ## Reviews & gates - Ontwerp door **codex** gereviewd (NO-GO → alle punten verwerkt: proxy-allowlist, transactionele gate, IP-rate-limit, status zonder leak, deploy-gate). - **Shared-DB deploy-gate GROEN** geverifieerd op scrum4me-srv (web + workers = `scrum4me-postgres`, DB `scrum4me`). - Onafhankelijke **adversariële security-review** van de claim-gate: APPROVED (alle 6 garanties). - Finale integratie-review: APPROVED. - `npm run verify` groen: **571 passed, 2 skipped (90 files)**. ## Geen - Geen wijziging aan scrum4me-web. Geen Prisma-migratie. Geen wijziging aan `vendor/scrum4me-shared`. ## Deploy - Nieuwe env `WEB_APP_BASE_URL` (default volstaat voor `thuis.jp-visser.nl`; override in `/srv/scrum4me/secrets/workers.env` indien nodig). - Handmatige e2e-rookproef (telefoon ingelogd op `WEB_APP_BASE_URL`) is een **post-deploy** check. Spec/plan: `docs/superpowers/{specs,plans}/2026-06-15-cross-app-qr-login*.md`. Scrum4Me: Sprint S-2026-06-15-1, PBI-9, Story ST-012, taken T-32…T-42. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Cross-app ontwerp: workers maakt LoginPairing, telefoon keurt goed via scrum4me-web /m/pair, workers claim mint admin-sessie. Verwerkt Codex-review: proxy-allowlist, shared-DB deploy-gate, transactionele rol-gate vóór consume, WEB_APP_BASE_URL verplicht, IP-rate-limit, status-endpoint zonder data-lek, testmatrix.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
scrum4me-server:claude bevestigde dat prod scrum4me-web (systemd scrum4me-web.service) en workers dezelfde scrum4me-postgres (DB scrum4me, schema public) gebruiken; login_pairings aanwezig. Cross-app aanpak vrijgegeven voor planning.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bite-sized TDD-plan voor cross-app QR-login: crypto+cookie kopie, WEB_APP_BASE_URL, IP-rate-limit, proxy-allowlist, start/status/claim routes (transactionele admin/demo-gate), desktop QR-UI. Verwerkt alle 7 Codex-review-items; shared-DB deploy-gate vooraf GROEN.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Security-critical claim route that atomically verifies approved pairing,
rejects demo/non-ADMIN users BEFORE consuming, and uses conditional
updateMany for double-claim race protection. Full TDD: 8/8 tests green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
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/scrum4me-workers!50
No description provided.