Authentifizierung mit OpenID Connect
Allgemeine Informationen zu OpenID Connect
| Inhaltsverzeichnis |
Was ist OpenID Connect?
OpenID Connect (OIDC) ist ein Authentifizierungsprotokoll, das auf OAuth 2.0 aufbaut. Es ermöglicht Clients, die Identität eines Benutzers auf Basis einer Authentifizierung durch einen Authorization Server (OpenID Provider) zu verifizieren. Zusätzlich können grundlegende Profilinformationen des Benutzers abgefragt werden.
Begriff | Beschreibung |
|---|---|
OpenID Provider (OP) | Der Authentifizierungsserver, der die Benutzeridentität verwaltet (z.B. Keycloak). |
Relying Party (RP) | Die Anwendung, die eine Authentifizierung anfordert; hier: der FirstSpirit-Server. |
ID Token | Ein JSON Web Token (JWT), das die Identität des authentifizierten Benutzers enthält. |
Access Token | Ein Token, das den Zugriff auf geschützte Ressourcen (z.B. den UserInfo-Endpoint) ermöglicht. |
UserInfo Endpoint | Ein OIDC-Endpoint, der zusätzliche Benutzerinformationen (Claims) bereitstellt. |
Claims | Schlüssel-Wert-Paare mit Benutzerinformationen (z.B. preferred_username, email, groups) |
Das FirstSpirit OIDC Login Modul unterstützt drei OAuth 2.0 / OpenID Connect-Flows:
- Authorization Code Flow: Browserbasiertes Login mit Redirect zum OpenID Provider (Single Sign-On (SSO))
- Resource Owner Password Credentials Flow: Direkter Login mit Benutzername und Passwort (für API- und CLI-Clients)
- Token Exchange Flow: Authentifizierung mit einem bereits vorhandenen Token (z.B. von einer vorgeschalteten Anwendung)
Modulbeschreibung
Funktionsweise und Architektur
Das FirstSpirit OIDC Login Modul ist ein JAAS-basiertes Authentifizierungsmodul, das als FirstSpirit-Modul (FSM) installiert wird. Es integriert sich in den standardmäßigen JAAS-Login-Mechanismus von FirstSpirit und delegiert die Authentifizierung an einen externen OpenID-Connect-Provider.
Untersützte Authentifizierungsflows
Authorization Code Flow (Browser-Login / SSO)
Der Authorization Code Flow wird für browserbasiertes Login über den ContentCreator oder andere Web-Clients verwendet. Der Ablauf ist wie folgt:
- Der Benutzer ruft den FirstSpirit-Client im Browser auf.
- Das Login-Modul leitet den Browser zum Login-Formular des OpenID Providers weiter.
- Nach erfolgreicher Authentifizierung leitet der Provider den Browser mit einem Authorization Code zurück an FirstSpirit.
- Das Modul tauscht den Authorization Code gegen ein ID-Token und ein Access-Token ein.
- Das Modul validiert das ID-Token und ruft optional den UserInfo-Endpoint ab.
- Der Benutzer wird in FirstSpirit angemeldet.
Dieser Flow unterstützt Single Sign-On (SSO); d.h., ist der Benutzer bereits beim OpenID Provider angemeldet, erfolgt die Authentifizierung ohne erneute Passworteingabe.
Resource Owner Password Credentials Flow (CLI/API)
Der Password Flow wird für nicht-interaktive Clients verwendet, z.B. für API-Zugriffe. Der Ablauf ist wie folgt:
- Der Client sendet Benutzername und Passwort an FirstSpirit.
- Das Login-Modul sendet die Zugangsdaten direkt an den Token-Endpoint des OpenID Providers.
- Der Provider antwortet mit einem ID-Token und einem Access-Token.
- Das Modul validiert das ID Token und ruft optional den UserInfo-Endpoint ab.
- Der Benutzer wird in FirstSpirit angemeldet.
![]() |
Nicht alle OpenID-Provider unterstützen den Password Flow. Prüfen Sie die Dokumentation Ihres Providers. |
Token Exchange Flow (Token-basierte Authentifizierung)
Der Token-Exchange-Flow ermöglicht die Authentifizierung mit einem bereits vorhandenen Token. Dies ist nützlich, wenn eine vorgeschaltete Anwendung bereits ein gültiges Token besitzt. Der Ablauf ist wie folgt:
- Der Client übergibt ein vorhandenes Token (Access Token, ID Token oder Refresh Token) an FirstSpirit.
- Das Login-Modul tauscht dieses Token beim Token-Endpoint des OpenID Providers gegen ein neues ID Token und Access Token aus (RFC 8693 Token Exchange).
- Das Modul validiert das neue ID Token und ruft optional den UserInfo-Endpoint ab.
- Der Benutzer wird in FirstSpirit angemeldet.
Unterstützte Token-Typen:
Token-Typ | Beschreibung |
|---|---|
Access Token (Standard) | Bearer Access-Token wird verwendet, wenn kein Typ angegeben ist. |
ID | ID-Token |
refresh | Refresh-Token |
![]() |
Nicht alle Identity Provider unterstützen alle Token-Typen. Keycloak unterstützt beispielsweise nur Access-Token. |
FS-Connection mit Token aufbauen
Eine FirstSpirit-Verbindung kann mit einem vorhandenen Token über die Verbindungsparameter hergestellt werden:
import de.espirit.firstspirit.access.*;
// Verbindung mit Access Token (Standard)
Connection c = ConnectionManager.getConnection(
"localhost", 4088, ConnectionManager.SOCKET_MODE,
"plain", Map.of("token", "abc123...")
);
c.connect();
// Mit explizitem Token-Typ:
Map.of("token", "abc123...", "tokenType", "refresh")
Map.of("token", "abc123...", "tokenType", "ID")
Voraussetzungen
Für die Einrichtung des OIDC-Login-Moduls werden die folgenden Voraussetzungen benötigt:
- FirstSpirit Server ab Version 5.2.250606 mit JAAS-Unterstützung
- Registrierter OpenID Connect Provider (Issuer), hier Keycloak
- Client-Registrierung beim Provider:
- Client ID
- Client Secret (empfohlen)
- Konfigurierte Redirect-URI (für den Authorization Code Flow)
- Netzwerkzugriff vom FirstSpirit Server zum OpenID Provider (HTTPS)
Client-Registrierung beim Provider
Registrieren Sie eine neue Client-Anwendung bei Ihrem OpenID Provider mit den folgenden Einstellungen:
Einstellung | Wert |
|---|---|
Client Type | Confidential (mit Client Secret) |
Redirect URI | Die URL des FirstSpirit-Servers, z.B. https://firstspirit.example.com/fs5/auth |
Grant Types | authorization_code |
Scopes | openid, profile, email; |
![]() |
Die genaue Vorgehensweise hängt vom verwendeten OpenID-Provider ab. |
Installation und Einrichtung des Moduls
FSM-Datei installieren
- Öffnen Sie den ServerManager und verbinden Sie sich mit dem FirstSpirit Server.
- Navigieren Sie zu Server-Eigenschaften > Module.
- Klicken Sie auf Installieren und wählen Sie die Datei fs-oidc-login-{version}.fsm aus.
- Bestätigen Sie die Installation.
WebApp-Deployment (für Authorization Code Flow)
Wenn der Authorization Code Flow verwendet werden soll, muss die Web-Komponente des Moduls zur Root-WebApp hinzugefügt werden:
- Navigieren Sie im ServerManager zu Projekt-Eigenschaften > Web-Komponenten.
- Fügen Sie die Web-Komponente des OIDC-Moduls zur Root-WebApp hinzu.
- Deployen Sie die Root-WebApp neu.
Ohne diesen Schritt steht der HTTP-Callback-Endpoint für den Authorization Code Flow nicht zur Verfügung.
OIDC-Service starten
Nach der Installation muss der Service OIDC Service gestartet werden:
- Navigieren Sie im ServerManager zu Server-Eigenschaften > Module > fs-oidc-login > OIDC Service.
- Starten Sie den Service über den Start-Button bzw. aktivieren Sie Automatisch starten.
Der Service stellt die Konfigurationsschnittstelle bereit und wird von den Login-Modulen benötigt.
Konfigurationsdatei bearbeiten (ServerManager GUI)
- Doppelklicken Sie auf den OIDC Service um die Konfigurationsoberfläche zu öffnen.
- Die Konfigurationsdatei fs-oidc.conf wird in einem Texteditor angezeigt.
- Passen Sie die Konfiguration an Ihren OpenID Provider an.
- Klicken Sie auf OK um die Konfiguration zu speichern.
Über den Upload-Button können Sie zusätzliche Dateien (z. B. statische Provider-Metadaten) in das Konfigurationsverzeichnis hochladen.
Die Konfigurationsdatei wird im Verzeichnis {FS-Install}/conf/fs-oidc/fs-oidc.conf
gespeichert.
JAAS-Konfiguration anpassen
Passen Sie die JAAS-Konfigurationsdatei fs-jaas.conf an. Der Standardpfad ist {FS-Install}/conf/fs-jaas.conf.
Mehr Informationen zur JAAS-Konfiguration finden Sie in hier.
Konfigurationsdatei (fs-oidc.conf)
Die Konfiguration des OIDC-Login-Moduls erfolgt über die Datei fs-oidc.conf im Verzeichnis {FS-Install}/conf/fs-oidc/. Die Datei verwendet ein INI-ähnliches Format mit Sektionen.
Aufbau und Sektionen
Die Konfigurationsdatei unterstützt mehrere Sektionen. Jede Sektion wird durch [sektionsname] eingeleitet. Die Sektion [default] ist die Standardsektion und dient als Fallback: Wenn ein Wert in einer spezifischen Sektion nicht gefunden wird, wird automatisch der Wert aus [default] verwendet.
Welche Sektion eines Login-Moduls verwendet wird, wird in der JAAS-Konfigurationsdatei fs-jaas.conf über die Option section festgelegt (siehe JAAS-Konfiguration).
Beispielstruktur:
[default]
# Gemeinsame Konfiguration fuer alle Flows
op.issuer=https://idp.example.com/realms/myrealm
rp.clientId=firstspirit
rp.clientSecret=geheim123
import.user=true
user.login=${oidc:preferred_username}
[auth]
# Spezifische Konfiguration fuer den Authorization Code Flow
rp.redirectUri=${request:PROXY}
[pass]
# Spezifische Konfiguration für den Password Flow
op.scopes=openid, profile, email
In diesem Beispiel erben [auth] und [pass] alle Werte aus [default], überschreiben jedoch einzelne Eigenschaften für ihren jeweiligen Anwendungsfall.
OpenID Provider Konfiguration (op.*)
Property | Beschreibung | Default |
|---|---|---|
op.issuer | Pflicht. Issuer-URL des OpenID-Providers. | (leer) |
op.metadata | Optionaler Dateiname oder URL für statische Provider-Metadaten im JSON-Format. Wenn der Wert mit „http:“ oder „https:“ beginnt, wird er als URL behandelt, aAndernfalls wird eine Datei im Konfigurationsverzeichnis erwartet. Wenn leer, wird die automatische Discovery über {issuer}/.well-known/openid-configuration verwendet. | (leer) |
op.metadata.cacheTime | Cache-Dauer für Provider-Metadaten in Sekunden. Wenn leer, wird die Cache-Dauer aus den HTTP-Response-Headern ermittelt (siehe hier). | (leer) |
op.scopes | Kommagetrennte Liste der zu beantragenden OAuth-Scopes. | openid, profile, email, phone, groups |
Relying Party Konfiguration (rp.*)
Property | Beschreibung | Default |
|---|---|---|
rp.clientId | Pflicht. Die Client-ID, die beim OpenID-Provider registriert ist. | (leer) |
rp.clientSecret | Das Client-Secret für die Authentifizierung am Token-Endpoint. Wenn es leer ist, wird keine Client-Authentifizierung durchgeführt. Die Authentifizierungsmethode (client_secret_basic oder client_secret_post) wird automatisch anhand der Provider-Metadaten gewählt. | (leer) |
rp.redirectUri | Die Redirect-URI für den Authorization Code Flow muss mit der beim Provider konfigurierten Redirect-URI übereinstimmen. Variablenersetzung wird unterstützt (siehe hier). | ${request:URI} |
Benutzer-Import Konfiguration (import.*, user.*)
Property | Beschreibung | Default |
|---|---|---|
import.user | Wenn true, wird der Benutzer bei jedem Login in FirstSpirit angelegt oder aktualisiert. | true |
user.login | Pflicht. Mapping für den FirstSpirit-Login-Namen. | ${oidc:preferred_username} |
user.email | Mapping für die E-Mail-Adresse des Benutzers. | ${oidc:email} |
user.phone | Mapping für die Telefonnummer des Benutzers. | ${oidc:phone_number} |
user.abbreviation | Mapping für das Kürzel des Benutzers. | ${oidc:preferred_username} |
user.realname | Mapping für den Anzeigenamen des Benutzers. | ${oidc:name} |
user.groups | Kommagetrennte Liste der Benutzergruppen, die typischerweise über den OIDC-Claim groups gemappt werden. | ${oidc:groups} |
user.section | Zusätzliche Abschnittsinformation für den Benutzer. | ${oidc:sub} ${oidc:exp} |
Verhalten beim Benutzer-Import (import.user=true)
- Benutzer werden als extern markiert.
- Das Passwort von nicht-Administrator-Benutzern wird auf einen leeren String gesetzt (Login nur über OIDC möglich).
- Das Passwort des Administrator-Benutzers (Admin) wird nicht verändert, damit ein lokaler Login weiterhin möglich bleibt.
- Bei jedem Login werden die Benutzereigenschaften (Name, E-Mail, Gruppen etc.) aktualisiert.
Gruppen-Mapping (group.*)
Property | Beschreibung | Default |
|---|---|---|
group.match.mode | Match-Modus für externe Gruppennamen. Mögliche Werte: contains (der externe Gruppenname muss im FS-Gruppennamen enthalten sein) oder equals (exakte Übereinstimmung). | contains |
group.name | Mapping für den externen Gruppennamen. Ermöglicht das Hinzufügen eines Präfixes oder Suffixes. Die Variable ${oidc:groupName} enthält den aktuellen Gruppennamen aus der user.groups-Liste. | ${oidc:groupName} |
Variablenersetzung
Konfigurationswerte in fs-oidc.conf unterstützen Variablenersetzung. Variablen haben die Syntax ${namespace:name} und werden zur Laufzeit aufgelöst.
OIDC-Claims (${oidc:*})
OIDC-Variablen werden aus den Claims des ID Tokens und der UserInfo-Antwort befüllt. UserInfo-Claims haben dabei Vorrang vor JWT-Claims, das heißt, wenn ein Claim sowohl im ID Token als auch in der UserInfo-Antwort vorhanden ist, wird der Wert aus der UserInfo-Antwort verwendet.
Standard-JWT-Variablen
Variable | Beschreibung |
|---|---|
${oidc:Subject} | JWT Subject (sub): eindeutige Benutzer-ID beim Provider |
${oidc:Issuer} | JWT Issuer (iss): URL des ausstellenden Providers |
${oidc:Audience} | JWT Audience (aud): Empfänger des Tokens (Client-ID) |
${oidc:JwtId} | JWT ID (jti): eindeutige Token-ID |
${oidc:IssuedAt} | Ausstellungszeitpunkt des Tokens (ISO-8601 Format) |
${oidc:Expiration} | Ablaufzeitpunkt des Tokens (ISO-8601 Format) |
OIDC Standard-Claims
Alle OIDC Standard Claims und JWT Registered Claims können über ${oidc:claimName} referenziert werden.
Häufig verwendete Claims:
Variable | Beschreibung |
|---|---|
${oidc:preferred_username} | Bevorzugter Benutzername |
${oidc:name} | Vollständiger Name |
${oidc:given_name} | Vorname |
${oidc:family_name} | Nachname |
${oidc:email} | E-Mail-Adresse |
${oidc:phone_number} | Telefonnummer |
${oidc:groups} | Gruppenmitgliedschaften (providerabhängig) |
${oidc:sub} | Subject Identifier (identisch mit ${oidc:Subject}) |
Spezial-Variable für Gruppen-Mapping
Variable | Beschreibung |
|---|---|
${oidc:groupName} | Der aktuelle Gruppenname während der Verarbeitung der user.groups-Liste. Nur innerhalb von group.name verwendbar. |
![]() |
Wenn eine Variable nicht aufgelöst werden kann, wird sie durch einen leeren String ersetzt und eine Warnung wird im Log ausgegeben. |
FirstSpirit-Eigenschaften (${fs:*})
FirstSpirit-Server-Properties können über ${fs:propertyName} referenziert werden. Der Wert wird aus der Server-Konfiguration (fs-server.conf) gelesen.
Beispiel:
rp.redirectUri=https://${fs:SYMBOLIC_HOSTNAME}/fs5/auth→ Liest den Wert der Server-Property SYMBOLIC_HOSTNAME aus der FirstSpirit-Server-Konfiguration aus.
HTTP-Request-Variablen (${request:*})
Diese Variablen sind nur im Authorization Code Flow verfügbar, da dort ein HTTP-Request vorliegt.
Variable | Beschreibung |
|---|---|
${request:URI} | Die aktuelle HTTP-Request-URL inklusive Protokoll, Hostname, Port und Pfad (ohne Query-Parameter). |
${request:PROXY} | Wie ${request:URI}, berücksichtigt jedoch zusätzlich die X-Forwarded-* Header eines vorgeschalteten Reverse-Proxys. Ausgewertete Header: X-Forwarded-Proto, X-Forwarded-Host, X-Forwarded-Port. |
${request:FORWARDED} | Wie ${request:URI}, berücksichtigt jedoch den RFC 7239 Forwarded Header eines vorgeschalteten Reverse-Proxys; Beispiel: Forwarded: proto=https;host=external.example.com. |
Empfehlung für Reverse-Proxy-Setups
Verwenden Sie ${request:PROXY} oder ${request:FORWARDED} für rp.redirectUri, damit die Redirect-URI die externe (öffentliche) URL des Servers enthält:
# Für Reverse Proxys mit X-Forwarded Headern:
rp.redirectUri=${request:PROXY}
# Für Reverse Proxys mit RFC 7239 Forwarded Header:
rp.redirectUri=${request:FORWARDED}
Standard-Ports (80 für HTTP, 443 für HTTPS) werden in der generierten URL automatisch weggelassen.
Provider-Metadaten und Caching
Das Modul benötigt die Metadaten des OpenID-Providers (Endpoints, unterstützte Algorithmen, Scopes etc.). Diese können auf drei Arten bereitgestellt werden.
Auto-Discovery
Wenn op.metadata leer ist, wird die automatische Discovery verwendet. Das Modul ruft die Standard-URL {op.issuer}/.well-known/openid-configuration ab.
![]() |
Dies ist die empfohlene Methode, da die Metadaten immer aktuell sind. |
Statische Metadaten (Datei oder URL)
Alternativ kann op.metadata wie folgt gesetzt werden:
- Datei: Ein Dateiname (ohne Pfad) im Konfigurationsverzeichnis {FS-Install}/conf/fs-oidc/. Die Datei muss das JSON-Format der OpenID-Provider-Metadaten enthalten. Dateien können über den Upload-Button in der ServerManager-GUI hochgeladen werden.
- URL: Eine URL, die mit http: oder https: beginnt. Das Modul ruft die Metadaten von dieser URL ab.
# Datei im Konfigurationsverzeichnis:
op.metadata=provider-metadata.json
# URL:
op.metadata=https://idp.example.com/.well-known/openid-configuration
Cache-Konfiguration
Provider-Metadaten werden gecacht um wiederholte HTTP-Anfragen zu vermeiden. Die Cache-Dauer wird in folgender Priorität bestimmt:
- Konfigurations-Wert: op.metadata.cacheTime in Sekunden (wenn gesetzt)
- HTTP Cache-Control Header: max-age-Direktive aus der HTTP-Antwort
- HTTP Expires Header: Ablaufzeitpunkt aus der HTTP-Antwort
- Kein Caching: Wenn keine der obigen Informationen verfügbar ist
Für statische Metadaten aus einer Datei beträgt die Standard-Cache-Dauer 10 Minuten.
Beispiel:
# Metadaten 1 Stunde cachen:
op.metadata.cacheTime=3600
JAAS-Konfiguration
Die Login-Module werden in der JAAS-Konfigurationsdatei fs-jaas.conf (Standardpfad: {FS-Install}/conf/fs-jaas.conf) konfiguriert. Jedes Login-Modul wird mit seinem vollqualifizierten Klassennamen und einem Control-Flag eingetragen.
Authorization Code Flow
fs5 {
com.crownpeak.firstspirit.auth.oidc.OidcAuthLoginModule sufficient;
};Dieses Login-Modul kann nur für browserbasierte Clients verwendet werden, die HTTP-Redirects unterstützen.
Da das Modul einen HTTP-Redirect auf den IdP durchführt, sollte es immer an letzter Stelle in der jeweiligen JAAS-Konfiguration mit dem Wert sufficient stehen. Für die anderen Login-Flows gilt diese Einschränkung nicht.
Password Flow
fs5 {
com.crownpeak.firstspirit.auth.oidc.OidcPassLoginModule sufficient;
};Dieses Login-Modul wird für SiteArchitect, ServerManager und CLI-Zugriffe (fs-cli) verwendet.
Token Exchange Flow
fs5 {
com.crownpeak.firstspirit.auth.oidc.OidcTokenLoginModule sufficient;
};Kombination mehrerer Flows
In der Regel werden mehrere Login-Module kombiniert, um verschiedene Client-Typen zu unterstützen. Die Module werden in der angegebenen Reihenfolge aufgerufen. Das Control-Flag sufficient bewirkt, dass die Verarbeitung bei erfolgreicher Authentifizierung durch ein Modul stoppt.
fs5 {
com.crownpeak.firstspirit.auth.oidc.OidcAuthLoginModule sufficient;
com.crownpeak.firstspirit.auth.oidc.OidcPassLoginModule sufficient;
};Typische Konfiguration mit Fallback auf lokale Authentifizierung
fs5 {
com.crownpeak.firstspirit.auth.oidc.OidcPassLoginModule sufficient;
de.espirit.firstspirit.server.authentication.FSUserLoginModule optional; }
;
websso {
de.espirit.firstspirit.server.authentication.FSTicketLoginModule sufficient;
de.espirit.firstspirit.server.authentication.FSUserLoginModule optional;
com.crownpeak.firstspirit.auth.oidc.OidcAuthLoginModule sufficient;
};Im Block fs5 wird zuerst der Password Flow (CLI/API) und anschließend das lokale FirstSpirit-Login versucht. Der websso-Block wird für browserbasierte Clients verwendet: Zuerst wird ein vorhandenes Ticket geprüft, dann das lokale Login und zuletzt der Auth-Code-Flow mit Redirect zum IdP. Dadurch bleibt ein Login mit lokalen FirstSpirit-Zugangsdaten (z. B. Admin) möglich.
Verwendung von Sektionen
Über die Option section kann jedes Login-Modul auf eine bestimmte Sektion in der fs-oidc.conf verwiesen werden. So können die Flows unterschiedlich konfiguriert werden, obwohl sie dieselbe Konfigurationsdatei nutzen:
fs5 {
com.crownpeak.firstspirit.auth.oidc.OidcAuthLoginModule sufficient section="auth";
com.crownpeak.firstspirit.auth.oidc.OidcPassLoginModule sufficient section="pass";
};In diesem Beispiel verwendet der Auth Code Flow die Sektion [auth] und der Password Flow die Sektion [pass] aus der fs-oidc.conf. Werte, die in der jeweiligen Sektion nicht gesetzt sind, werden aus [default] übernommen.
Wenn keine section angegeben ist, wird automatisch die Standard-Sektion benutzt.
Konfigurationsbeispiel - Keycloak
Voraussetzungen bei Keycloak
- Erstellen Sie einen neuen Client in Ihrem Keycloak Realm.
- Setzen Sie Client authentication auf On (Confidential).
- Aktivieren Sie Standard flow (Authorization Code) und optional Direct access grants (Password Flow).
- Fügen Sie die Redirect-URI hinzu, z. B. https://firstspirit.example.com/*.
- Optional: Erstellen Sie einen Client-Scope groups mit einem Mapper vom Typ Group Membership, der den Claim groups erzeugt.
Konfiguration
fs-oidc.conf
[default]
op.issuer=https://keycloak.example.com/realms/myrealm
op.scopes=openid, profile, email, phone, groups
rp.clientId=firstspirit
rp.clientSecret=IHR_CLIENT_SECRET
import.user=true
user.login=${oidc:preferred_username}
user.email=${oidc:email}
user.phone=${oidc:phone_number}
user.abbreviation=${oidc:preferred_username}
user.realname=${oidc:name}
user.groups=${oidc:groups}
user.section=${oidc:sub} ${oidc:exp}
group.match.mode=contains
group.name=${oidc:groupName}
[auth]
rp.redirectUri=${request:PROXY}
fs-jaas.conf
fs5 {
com.crownpeak.firstspirit.auth.oidc.OidcPassLoginModule sufficient;
de.espirit.firstspirit.server.authentication.FSUserLoginModule optional;
};
websso {
de.espirit.firstspirit.server.authentication.FSTicketLoginModule sufficient;
de.espirit.firstspirit.server.authentication.FSUserLoginModule optional;
com.crownpeak.firstspirit.auth.oidc.OidcAuthLoginModule sufficient section="auth";
};Fehlererkennung und -behebung
Login schlägt fehl
Symptom | Mögliche Ursache | Lösung |
|---|---|---|
"Parameter not set: [...] rp.clientId" | Client-ID nicht konfiguriert | rp.clientId in fs-oidc.conf setzen |
"Parameter not set: [...] op.issuer" | Issuer-URL nicht konfiguriert | op.issuer in fs-oidc.conf setzen |
"Token request error 'invalid_client'" | Falsches Client-Secret | rp.clientSecret prüfen |
"Token request error 'invalid_grant'" | Ungültige Zugangsdaten oder abgelaufener Code | Zugangsdaten prüfen; beim Auth Code Flow ggf. Redirect-URI prüfen |
"Token request error 'unauthorized_client'" | Client nicht für den verwendeten Grant-Typ autorisiert | Grant-Types in der Provider-Konfiguration prüfen |
"ManagerProvider not available, OIDC login disabled." | OIDC Service nicht gestartet | Service im ServerManager starten (siehe hier) |
"Error creating OIDC login module instance" | Modul nicht korrekt installiert | FSM-Installation prüfen |
Redirect-URI-Probleme
Symptom | Mögliche Ursache | Lösung |
|---|---|---|
"redirect_uri_mismatch" beim Provider | Die Redirect-URI in fs-oidc.conf stimmt nicht mit der beim Provider konfigurierten URI überein. | URIs exakt abgleichen (Protokoll, Host, Port, Pfad) |
Redirect-URI enthaelt interne IP/Hostname | Reverse-Proxy leitet keine Forwarding-Header weiter. | ${request:PROXY} oder ${request:FORWARDED} verwenden und Proxy-Konfiguration prüfen |
Leere Redirect-URI | Kein HTTP-Request im Password Flow vorhanden | rp.redirectUri explizit setzen oder ${request:*} Variablen nur im Auth Code Flow verwenden |
Token-Validierungsfehler
Symptom | Mögliche Ursache | Lösung |
|---|---|---|
"Unexpected issuer" | Issuer im Token stimmt nicht mit op.issuer überein. | op.issuer prüfen -- muss exakt mit dem Issuer in den Provider-Metadaten übereinstimmen. |
"JWSAlgorithm not found" | Der Signatur-Algorithmus des Tokens wird vom Provider nicht in den Metadaten angegeben. | Provider-Konfiguration prüfen |
"Invalid Auth state" | Der State-Parameter der Authentifizierungsantwort ist unbekannt oder abgelaufen (Timeout: 10 Minuten) | Login erneut versuchen; bei langsamem Netzwerk ggf. die Ursache prüfen |
Logging und Debug-Ausgaben
Das Modul verwendet das FirstSpirit-Logging-Framework. Für detaillierte Debug-Ausgaben aktivieren Sie das Debug-Logging für die folgenden Pakete:
- com.crownpeak.firstspirit.auth.oidc: Login-Modul und Konfiguration
- com.crownpeak.firstspirit.auth.oidc.impl: Flow-Implementierungen
- com.crownpeak.firstspirit.auth.oidc.nimbus: OIDC/OAuth-Operationen (Token-Requests, Metadaten, Validierung)
Im Debug-Modus werden unter anderem folgende Informationen ausgegeben:
- Provider-Metadaten (Endpoints, unterstützte Algorithmen)
- Authentication Request URLs
- JOSE-Header und JWT-Claims des ID-Tokens
- UserInfo-Antworten
- Warnungen bei unbekannten oder fehlenden Claims/Variablen
![]() |
Debug-Logging kann sensible Daten (Tokens, Claims) im Log ausgeben. Aktivieren Sie es nur temporär zur Fehleranalyse und deaktivieren Sie es anschließend wieder. |


