04 – IAM / Keycloak
Modul addon_25_iam.sh, Funktionen install_addon_iam und uninstall_addon_iam mit den Teilfunktionen ensure_p2d2_oidc_client, ensure_p2d2_client_roles, ensure_p2d2_role_token_mapper und ensure_osm_identity_provider.
Was das Skript tut (Schritt für Schritt)
Das Modul provisioniert die p2d2-Integration im bestehenden Keycloak (Realm cc-prd), ohne neue Secrets anzulegen — es liest nur das vorhandene Admin-Secret.
- Admin-/Master-Token holen (
_iam_get_token):admin-cli-Password-Grant gegenhttps://idm.<DOMAIN>/realms/master/protocol/openid-connect/token; Credentials aus dem Secret<env>-keycloak-admin(KeysMASTER_USERNAME/MASTER_PASSWORD) im Access-Namespace (ADDON_IAM_NS, Defaultcc-prd-access-stack). - OIDC-Client anlegen (
ensure_p2d2_oidc_client): confidential (publicClient:false),standardFlowEnabled, 5 Redirect-URIs (je Stagewww/dev/f-de1/f-de2/f-fv.${ADDON_DOMAIN}) plus lokale Dev-Origin (http://localhost:4321). Post-Logout-Redirect-URIs werden mit##getrennt (nicht mit Leerzeichen — sonst Keycloak-400). - 6 Client-Rollen (
ensure_p2d2_client_roles):editor,export_admin,qs1_reviewer,qs2_reviewer,osm,verwaltung. - Rollen-Token-Mapper (
ensure_p2d2_role_token_mapper): Mapperclient roles(oidc-usermodel-client-role-mapper) schreibtresource_access.<client_id>.rolesauch in den ID-Token (id.token.claim=true) — entscheidend, da der p2d2-Code ausschließlich das ID-Token dekodiert. - OSM-IdP-Broker (
ensure_osm_identity_provider): generischer OAuth2-IdP (Aliasosm) mitP2D2_OSM_IDP_CLIENT_ID/_SECRETaus.env.p2d2-addon; inkl. IdP-Mapper. - 6 Demo-Accounts (
ADDON_IAM_DEMO_USERS) mit Rollen-Grants (z. B.hans→editor verwaltung,meera→osm qs1_reviewer,valentina→qs2_reviewer qs1_reviewer osm export_admin). - Rückbau: entfernt Client, IdP und Demo-Accounts spiegelbildlich.
Ausgangslage (vorausgesetzt)
- Keycloak (Realm
cc-prd) läuft im Access-Namespace; das Admin-Secret<env>-keycloak-administ vorhanden. .env.p2d2-addonliefertP2D2_OSM_IDP_CLIENT_ID/_SECRET(undP2D2_DEMO_PASSWORDfür die Demo-Accounts).
Zielergebnis
Im Realm cc-prd: ein OIDC-Client mit 5 Redirect-URIs + lokaler Dev-Origin, 6 Client-Rollen, der Rollen-Token-Mapper (ID- + Access-Token), der OSM-IdP-Broker und 6 Demo-Accounts mit Rollen. Die OIDC-Client-Daten werden dem Frontend über das Basis-Secret (P2D2_BASE_OIDC_ISSUER/_CLIENT_ID/_CLIENT_SECRET) bereitgestellt.
Manuelle Installation / Troubleshooting
- Die IAM-Konfiguration ersetzt die frühere Zitadel-Anbindung durch Keycloak als einheitlichen Identity-Provider für alle Stages (ein Realm, ein OIDC-Client).
- Der Token-Mapper muss
id.token.claim=truesetzen, sonst fehlen die Rollen im ID-Token und der Login/Rollenabruf im Frontend schlägt fehl. - Die Demo-Accounts dienen der QS (
qs1_reviewer/qs2_reviewer) und den Rollen-Tests (verwaltung,osm,export_admin).
Bekannte Fallstricke
- Post-Logout-Redirect-URIs müssen mit
##(nicht Leerzeichen) getrennt werden — sonst validiert Keycloak den ganzen String als eine URI und liefert HTTP 400 (Turn 75). clientId-Query-Filter filtert je nach Keycloak-Version nicht zuverlässig → volle Client-Liste lesen und clientseitig filtern (_iam_get_client_uid).- Rollen nur im Access-Token (Default) reichen nicht — der Mapper muss in den ID-Token schreiben.
- Passwort-Policy: Demo-Account-Passwörter müssen die Realm-Policy erfüllen (sonst 400).
- Keycloak-Verständnis: Wenn ein Keycloak-Objekt halb angelegt/zersetzt ist, ist ein Neuaufbau vom Scratch oft sicherer als Flickwerk (Turn 75).