Django scaffold aligned with the business delivery lane: tenant-keyed Member model without passwords, identity app as sole OIDC/session boundary, dev-claims login, authenticated /app/ shell, ADR-0001, and tests. T01/T02/T05/T06 done; OIDC registration, real user-engine HTTP, flex-auth, and packaging remain open.
3.2 KiB
| id | title | status | date | workplan | task |
|---|---|---|---|---|---|
| ADR-0001 | NetKingdom identity for coulomb.social | accepted | 2026-08-09 | CSOC-WP-0002 | CSOC-WP-0002-T01 |
ADR-0001 — NetKingdom identity for coulomb.social
Status
Accepted (2026-08-09).
Context
coulomb.social is being reestablished as a standalone business application (DR-2 B) on the Railiance delivery lane. The business-app service contract v0.1 defaults to app-local accounts (DR-3 A) with a bounded auth module for a later OIDC switch.
A social product with many members is a poor fit for a private password database inside the app: credential lifecycle, MFA, and user-domain profiles already exist (or are governed) in the NetKingdom landscape.
Decision
-
Authentication uses only the NetKingdom IAM Profile (OIDC + PKCE). The app depends on the profile contract, not on KeyCape vs Keycloak implementation details.
-
User-domain facts (account, profile, memberships, identity links) are owned by user-engine. This app maps
(issuer, sub)to a localMemberrow for session convenience and never stores passwords. -
Authorization for protected actions is decided by flex-auth (PDP). The app is a PEP only (fail-closed when the PDP is unavailable for sensitive actions). Dev may use a local deny-by-default stub until the protected system is registered.
-
Browser session after successful OIDC is an application session (Django session / signed cookie). Tokens are not treated as long-lived API credentials in the browser.
-
Tenant model: all client-owned data is keyed by
tenant_idfrom the first migration (Binky Hedgehog = client #1 / reference tenant). -
Relationship to DR-3 A: the contract’s “app-local baseline” remains valid for simple single-tenant tools (e.g. vergabe-teilnahme v1). This ADR specializes coulomb.social onto NetKingdom identity as a product decision; the auth code still lives in one module (§2.3) so issuer mode can change without rewriting the product.
Issuer modes
| Mode | When |
|---|---|
Dev mock claims (DEBUG + OIDC_ENABLED=false) |
Local unit/integration tests and offline shell work |
| local-identity / KeyCape | Bootstrap and lightweight platform environments |
| Keycloak expanded | Production / enterprise MFA & federation when platform provides it |
Non-goals
- App-local password / MFA store
- Bubble as identity provider
- Content migration from Bubble in this identity track
- Owning KeyCape, Keycloak, user-engine, or flex-auth codebases
Consequences
- Scaffold uses Django aligned with the business delivery lane, with a
dedicated
identityapp as the sole OIDC/session boundary. - OpenBao (or local 0600 files) holds OIDC client secrets; nothing secret in Git.
- Content re-claim is a separate workplan after the authenticated shell works.
References
workplans/CSOC-WP-0002-netkingdom-user-management-reestablish.mdnet-kingdom/canon/standards/iam-profile_v0.2.md(and v0.3)net-kingdom/canon/standards/user-engine-boundary-contract_v0.1.mdthe-custodian/canon/standards/business-app-service-contract_v0.1.mdthe-custodian/docs/business-platform-decision-records.md(DR-2, DR-3)