Club Identity Contract¶
Diese Seite beschreibt den kanonischen Multi-Club-Identity-Vertrag fuer Punkt 41, Phase 1. Sie ist die Referenz fuer Keycloak-Attribute, JWT-Claims und die serverseitige Spiegelung in UserSetting.data.
Status¶
- Phase 1 ist abgeschlossen.
- Der Keycloak-Bestand wurde auf den kanonischen Club-Attributvertrag bereinigt.
- Aktive JWT-/Keycloak-Pfade fuer Club-Claims lesen nur noch
clubid.*undclubname.*. - Writer schreiben nur noch die kanonischen Club-Attribute und loeschen bekannte Legacy-Keys aktiv bei Updates.
- Verbleibende lokale Club-Scope-Storage-Bruecken und numerische
vereinsId-Scopes sind ein separater Sunset-/Polish-Folgepunkt und gehoeren nicht mehr zum Abschluss von Punkt 41.
Zielbild¶
- Club-Identitaet wird kanonisch ueber
clubid.*undclubname.*transportiert. sportpassIdbleibt der kanonische Mitglieds-/Schuetzen-Identifikator.User.idbleibt der technische Keycloak-sub, aber die relationale Personen-Zuordnung wird serverseitig zusaetzlich ueber eindeutigesUser.sportpassIdgespiegelt.- Alte oder zusaetzliche
sub-Werte duerfen ueber eine Alias-Zuordnung auf denselben kanonischen User zeigen. - Web und Backend folgen fuer Club-Claims jetzt demselben Prioritaetsvertrag: kanonische Claims only.
Kanonische Claims¶
clubid.primary: stringclubname.primary: stringclubid.secondary: string[]optionalclubname.secondary: string[]optionalsportpassId: stringrealm_access.roles: string[]
Legacy-Kompatibilitaet¶
Legacy-Keycloak-Claimnamen fuer Club-Identitaet gehoeren nicht mehr zum aktiven Runtime-Vertrag:
primary.clubidsecondary.clubidclub_idsclubIdsclub_idclubclubNameclub_name
Diese Felder werden in den aktiven Auth-/JWT-Pfaden nicht mehr als Quelle fuer kanonische clubIds oder clubname* akzeptiert.
Bewusste Rest-Kompatibilitaet ausserhalb von Punkt 41:
preferred_usernamebleibt als separater Subject-/Sportpass-Fallback fuer Legacy-Loginfaelle bestehen.- lokale Web-Storage-Bruecken wie
targetshot:club_id,targetshot:club_name,targetshot:clubundtargetshot:vereinsIdbleiben bis zu einem spaeteren Shell-/Club-Scope-Sunset getrennt dokumentiert.
Keycloak Writer¶
Neue oder aktualisierte Keycloak-Attribute werden in Phase 1 nur noch in dieser Form geschrieben:
clubid.primaryclubid.secondaryclubname.primaryclubname.secondarysportpassId
Nicht mehr neu schreiben:
club_idclub_name- sonstige alte Club-Varianten
Serverseitige Spiegelung¶
UserSetting.data bleibt in Phase 1 die serverseitige Hilfsspiegelung fuer Web- und Backend-Pfade. Neue Token-/Keycloak-Synchronisationen schreiben dort nur noch die kanonische Form:
clubIdsclubPrimaryIdclubSecondaryIdsclubnamePrimaryclubnameSecondarysportpassIdclubIdsSource
Das alte Spiegel-Feld club_name wird nicht mehr neu beschrieben.
Parallel dazu gilt serverseitig:
User.sportpassIdist die relationale Unique-Spiegelung des kanonischen Personen-Identifiers.UserSubjectAlias.subjecthaelt alte oder sekundaresub-Werte fest, damit Legacy-Logins auf den kanonischen User gemappt werden koennen, ohnesportpassIdals Wahrheitsquelle wieder zu verwischen.
Audit- und Backfill-Plan¶
Phase 1 macht keine grosse Prisma-Migration und keinen grossen Datenumbau. Der Abschlussstand ist:
- Keycloak-Audit:
- der externe Keycloak-Bestand wurde auf den kanonischen Club-Attributvertrag bereinigt.
- Settings-Audit:
- serverseitige Spiegelung schreibt nur noch
clubIds,clubPrimaryId,clubSecondaryIds,clubnamePrimary,clubnameSecondaryundsportpassId. - Web-Storage-Audit:
- verbliebene lokale Shell-/Club-Scope-Bruecken bleiben sichtbar dokumentiert und sind ein separater Sunset-Folgepunkt, nicht mehr Teil von Punkt 41.
- Migrationsreihenfolge:
- Writer haerten
- Reader auf kanonische Felder priorisieren
- Legacy-Keycloak-Clubclaims aus aktiven Auth-/JWT-Pfaden entfernen
- lokale Storage-Bruecken spaeter separat kontrolliert abbauen