dorfteich/docs/architecture/adr
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
..
0001-typescript-monorepo.md Add architecture documentation, ADRs, and operations concept 2026-07-04 14:36:16 +02:00
0002-postgresql.md Add architecture documentation, ADRs, and operations concept 2026-07-04 14:36:16 +02:00
0003-yjs-crdt-collaboration.md Add architecture documentation, ADRs, and operations concept 2026-07-04 14:36:16 +02:00
0004-tiptap-editor.md Add architecture documentation, ADRs, and operations concept 2026-07-04 14:36:16 +02:00
0005-react-vite-frontend.md Add architecture documentation, ADRs, and operations concept 2026-07-04 14:36:16 +02:00
0006-nestjs-prisma-backend.md Add architecture documentation, ADRs, and operations concept 2026-07-04 14:36:16 +02:00
0007-auth-sessions-oidc-ready.md #190: configurable session lifetime with a server-side idle timeout 2026-07-30 11:11:15 +02:00
0008-plugin-sandbox.md Add architecture documentation, ADRs, and operations concept 2026-07-04 14:36:16 +02:00
0009-import-export-converters.md Add architecture documentation, ADRs, and operations concept 2026-07-04 14:36:16 +02:00
0010-postgres-fulltext-search.md Add architecture documentation, ADRs, and operations concept 2026-07-04 14:36:16 +02:00
0011-file-storage-quotas.md Scaffold pnpm monorepo with lint, format, and test tooling 2026-07-04 19:06:27 +02:00
0012-i18n.md Add architecture documentation, ADRs, and operations concept 2026-07-04 14:36:16 +02:00
0013-versioning-and-trash.md Scaffold pnpm monorepo with lint, format, and test tooling 2026-07-04 19:06:27 +02:00
0014-gitea-actions-cicd.md Move the stage directories to /srv/DOCKER (host consolidation) 2026-07-14 12:43:29 +02:00
0015-backup-strategy.md Add architecture documentation, ADRs, and operations concept 2026-07-04 14:36:16 +02:00
0016-self-hosted-fonts.md Add architecture documentation, ADRs, and operations concept 2026-07-04 14:36:16 +02:00
0017-accessibility-by-default.md docs: ADR 0017 — Barrierefreiheit als Standard-Anforderung 2026-07-21 17:17:26 +02:00
0018-color-theming.md #186: pond accent theming — scoped derivation, cascade pond > user > default 2026-07-29 09:09:36 +02:00
0019-no-security-base-functions.md docs: VS-NfD readiness planning (ist-aufnahme, plan, ADRs 0019-0026, issue drafts) 2026-07-30 01:48:05 +02:00
0020-token-crypto-key-separation.md docs: VS-NfD readiness planning (ist-aufnahme, plan, ADRs 0019-0026, issue drafts) 2026-07-30 01:48:05 +02:00
0021-external-authentication.md #214: OIDC Authorization Code with PKCE, Keycloak as reference IdP 2026-07-31 12:44:52 +02:00
0022-page-classification.md #212: mark attachment downloads by filename prefix and companion file 2026-07-31 07:29:16 +02:00
0023-read-access-audit-trail.md #225: read-trail master switch and written purpose limitation 2026-07-31 12:35:18 +02:00
0024-reproducible-offline-deployment.md docs: VS-NfD readiness planning (ist-aufnahme, plan, ADRs 0019-0026, issue drafts) 2026-07-30 01:48:05 +02:00
0025-plugin-trust-model.md docs: VS-NfD readiness planning (ist-aufnahme, plan, ADRs 0019-0026, issue drafts) 2026-07-30 01:48:05 +02:00
0026-backup-target-restriction.md docs: VS-NfD readiness planning (ist-aufnahme, plan, ADRs 0019-0026, issue drafts) 2026-07-30 01:48:05 +02:00