dorfteich/apps/web/src/pages
Claude Fable 5 5796b7a5dd
Some checks failed
CI / Lint, typecheck, test (pull_request) Failing after 14s
CI / Import/export fidelity gate (pull_request) Has been skipped
CI / Build container images (pull_request) Has been skipped
CI / Auth e2e pack (pull_request) Has been skipped
#214: OIDC Authorization Code with PKCE, Keycloak as reference IdP
External authentication (ADR 0021) built on jose (#188's vetted library)
plus fetch — no new dependency enters the supply chain for a security
base function. Discovery-configured; ID tokens validate against the
IdP's JWKS under an explicit RS256/ES256 allowlist with issuer,
audience, expiry and nonce binding. State, nonce and the PKCE verifier
travel in a signed HttpOnly Lax cookie keyed by a dedicated HKDF
purpose (oidc-state, ADR 0020).

Deploy-level configuration (OIDC_ISSUER/CLIENT_ID/CLIENT_SECRET/SCOPES/
PROVIDER_LABEL): who authenticates users is a platform decision. The
login page discovers the provider via GET /auth/methods and renders the
SSO button (i18n de+en).

Identities use the existing slot (provider oidc:<issuer>, subject from
the token). First login creates the account just-in-time — ACTIVE and
mail-verified only when the IdP asserts a verified address. An existing
local account is NEVER adopted silently by e-mail (account-takeover
path): login refuses with oidc_link_required and the owner links
explicitly via GET /auth/oidc/link (audited auth.identity_linked,
catalogue v1.3). Sessions come from the one existing session service.

Tests run the full flow against a protocol-faithful fake IdP: PKCE
verifier at the token endpoint, JIT creation incl. personal pond,
invalid state/nonce/signature/issuer/audience/expiry each rejected, the
linking refusal and the explicit link flow. Verified end-to-end against
a real Keycloak 26.0 (repeatable procedure documented in security.md
§External authentication).

Refs #214.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AUtYMxwTCMHG9mVHnwbFg8
2026-07-31 12:44:52 +02:00
..
auth #214: OIDC Authorization Code with PKCE, Keycloak as reference IdP 2026-07-31 12:44:52 +02:00
AdminBackupSection.tsx #192: deploy-level backup target allowlist 2026-07-30 12:17:14 +02:00
AdminSettingsPage.tsx #213: warn on uploads to classified pages; instance policy can block 2026-07-31 07:33:34 +02:00
AdminSystemPage.tsx #163: Dokumentsprache und Seitentitel der SPA 2026-07-21 13:52:59 +02:00
DeletePageDialog.tsx #162: Fokus-Management für Dialoge und Such-Palette 2026-07-21 13:52:59 +02:00
FontCatalogPage.tsx #163: Dokumentsprache und Seitentitel der SPA 2026-07-21 13:52:59 +02:00
HomePage.tsx #163: Dokumentsprache und Seitentitel der SPA 2026-07-21 13:52:59 +02:00
LegalPage.tsx #163: Dokumentsprache und Seitentitel der SPA 2026-07-21 13:52:59 +02:00
MaintenancePage.tsx #163: Dokumentsprache und Seitentitel der SPA 2026-07-21 13:52:59 +02:00
MovePageDialog.tsx #162: Fokus-Management für Dialoge und Such-Palette 2026-07-21 13:52:59 +02:00
NotFoundPage.tsx #163: Dokumentsprache und Seitentitel der SPA 2026-07-21 13:52:59 +02:00
PageActions.tsx #162: Fokus-Management für Dialoge und Such-Palette 2026-07-21 13:52:59 +02:00
PageEditorPage.tsx #213: warn on uploads to classified pages; instance policy can block 2026-07-31 07:33:34 +02:00
PageStatusBar.tsx #134 Statuszeile zwischen Navigation und Artikel 2026-07-19 01:04:11 +02:00
PluginManager.tsx UI polish: frameless plugin blocks in read mode, sticky toolbar, pinned footer, icon uninstall 2026-07-12 15:33:32 +02:00
PluginPreviewPage.tsx Add the sandbox host runtime for plugin iframes (#73) 2026-07-11 09:16:30 +02:00
PondHomePage.tsx #163: Dokumentsprache und Seitentitel der SPA 2026-07-21 13:52:59 +02:00
PondSettingsPage.tsx #186: pond accent theming — scoped derivation, cascade pond > user > default 2026-07-29 09:09:36 +02:00
PublicPageView.tsx #207: print stylesheet with the classification on every printed sheet 2026-07-31 06:48:44 +02:00
QuotaManager.tsx #168: Formulare — Fehler-Verdrahtung und Namenslücken 2026-07-21 14:26:54 +02:00
SettingsPage.tsx #186: pond accent theming — scoped derivation, cascade pond > user > default 2026-07-29 09:09:36 +02:00
TrashPage.tsx #163: Dokumentsprache und Seitentitel der SPA 2026-07-21 13:52:59 +02:00
UserManager.tsx #177: Admin-Personenliste — Aktions-Zelle bleibt Table-Cell, Flex auf Innen-Wrapper 2026-07-27 13:36:27 +02:00