diff --git a/.env.example b/.env.example index c005b33..39008e6 100644 --- a/.env.example +++ b/.env.example @@ -14,12 +14,12 @@ DATABASE_SSL=false OIDC_ISSUER=https://idp.example.com/realms/internal OIDC_CLIENT_ID=business-app OIDC_CLIENT_SECRET=change-me -OIDC_SCOPES=openid profile email +OIDC_SCOPES=openid profile email groups OIDC_LOGOUT_URL= OIDC_ALLOWED_ALGORITHMS=RS256 OIDC_HTTP_TIMEOUT_MS=5000 OIDC_ADMIN_ROLE=hauspilot-admin -OIDC_ROLES_CLAIM=roles +OIDC_ROLES_CLAIM=groups OIDC_ROLE_MATCH_CASE_SENSITIVE=true SESSION_COOKIE_NAME=app_session diff --git a/docs/configuration.md b/docs/configuration.md index 5a7694e..e49610d 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -42,6 +42,8 @@ separat ausgefuehrt. | `OIDC_LOGOUT_URL` | Optionale IdP-Logout-URL, falls Discovery keine liefert | | `OIDC_ALLOWED_ALGORITHMS` | Erlaubte ID-Token-Signaturalgorithmen, z. B. `RS256` | | `OIDC_HTTP_TIMEOUT_MS` | Timeout fuer IdP-HTTP-Requests | +| `OIDC_ADMIN_ROLE` | Externer Rollen- oder Gruppenname fuer Administratoren | +| `OIDC_ROLES_CLAIM` | Claim-Pfad der externen Rollen, z. B. `groups` | Der Callback ist immer: @@ -101,10 +103,13 @@ DATABASE_SSL=true OIDC_ISSUER=https://idp.example.com/realms/internal OIDC_CLIENT_ID=business-app OIDC_CLIENT_SECRET= -OIDC_SCOPES=openid profile email +OIDC_SCOPES=openid profile email groups OIDC_LOGOUT_URL=https://idp.example.com/realms/internal/protocol/openid-connect/logout OIDC_ALLOWED_ALGORITHMS=RS256 OIDC_HTTP_TIMEOUT_MS=5000 +OIDC_ADMIN_ROLE=hauspilot-admin +OIDC_ROLES_CLAIM=groups +OIDC_ROLE_MATCH_CASE_SENSITIVE=true SESSION_COOKIE_NAME=app_session SESSION_IDLE_TIMEOUT_SECONDS=28800 SESSION_ABSOLUTE_TIMEOUT_SECONDS=604800 diff --git a/docs/oidc-administrator.md b/docs/oidc-administrator.md index 61d2c4a..801c818 100644 --- a/docs/oidc-administrator.md +++ b/docs/oidc-administrator.md @@ -8,7 +8,7 @@ der frühere Mechanismus „erster Benutzer wird Administrator“ existiert nich ```env OIDC_ADMIN_ROLE=hauspilot-admin -OIDC_ROLES_CLAIM=roles +OIDC_ROLES_CLAIM=groups OIDC_ROLE_MATCH_CASE_SENSITIVE=true ``` @@ -17,6 +17,18 @@ OIDC_ROLE_MATCH_CASE_SENSITIVE=true `realm_access.roles` oder `resource_access.hauspilot.roles`. Der Claim darf ein String oder ein Array aus Strings sein; Leerwerte und Duplikate werden entfernt. +Der konfigurierte Claim muss vom Provider fuer die angeforderten Scopes geliefert werden. Fuer +Provider, die Gruppen ueber den standardnahen `groups`-Scope in UserInfo bereitstellen, gilt: + +```env +OIDC_SCOPES=openid profile email groups +OIDC_ROLES_CLAIM=groups +``` + +Das Backend liest den `userinfo_endpoint` aus der OIDC-Discovery und ruft ihn serverseitig mit dem +Access-Token auf. Der Access-Token und die vollstaendigen Claims werden nicht an den Browser gegeben +oder protokolliert. + Ist `OIDC_ADMIN_ROLE` leer oder nicht gesetzt, protokolliert der Start eine Warnung. HausPilot fügt dann keine OIDC-Administratorzuweisung hinzu und entfernt auch keine bestehende. Ein gesetztes `OIDC_ADMIN_ROLE` ohne gültiges `OIDC_ROLES_CLAIM` führt zu einem Startfehler.