====== Anmeldung aus Drittsystemen (JWT External) ====== Zur Anbindung an Drittsysteme bietet edp:web einen zusätzlichen Anmelde-Endpoint. Über diesen können Benutzer direkt aus einem externen System heraus in edp:web angemeldet werden — ohne dass die Benutzeraccounts in EDP vorhanden sein müssen. Dies ist insbesondere für größere Organisationen hilfreich, die eine zentrale Benutzerverwaltung betreiben und die Anmeldung an edp:web darüber steuern möchten. Die Authentifizierung erfolgt über ein **JSON Web Token (JWT)**, das vom Drittsystem erzeugt und kryptographisch signiert wird. edp:web prüft die Signatur und meldet den Benutzer mit den im Token enthaltenen Informationen an. ===== Funktionsweise ===== Der Anmeldevorgang läuft wie folgt ab: - Das **Drittsystem** erzeugt ein JWT mit den Benutzerdaten (Name, Funktion, Rolle) und signiert es mit seinem **privaten Schlüssel**. - Der Benutzer wird mit dem JWT an den edp:web-Endpoint **/jwt_ext** weitergeleitet. - **edp:web** prüft die Signatur des Tokens mit dem hinterlegten **öffentlichen Schlüssel** des Drittsystems. - Bei erfolgreicher Prüfung wird eine Sitzung erstellt und der Benutzer ist angemeldet. Drittsystem edp:web │ │ │ 1. JWT erzeugen & signieren │ │ 2. Weiterleitung mit JWT ──────►│ │ │ 3. Signatur prüfen (Public Key) │ │ 4. Sitzung erstellen │ ◄─────── Angemeldet ─────│ ===== Einrichtung ===== ==== 1. Schlüsselpaar erzeugen ==== Die Authentifizierung basiert auf einem **RSA-Schlüsselpaar** (asymmetrische Verschlüsselung). Das Drittsystem signiert das JWT mit dem privaten Schlüssel, edp:web prüft die Signatur mit dem öffentlichen Schlüssel. Das Schlüsselpaar kann z.B. mit OpenSSL erzeugt werden: openssl genrsa -out jwt_external_private.pem 2048 openssl rsa -in jwt_external_private.pem -pubout -out jwt_external_public.pem * **jwt_external_private.pem** → Verbleibt beim Drittsystem (zum Signieren der Tokens) * **jwt_external_public.pem** → Wird auf dem edp:web-Server hinterlegt (zum Prüfen der Tokens) **Wichtig:** // Der private Schlüssel darf nicht an Dritte weitergegeben werden und sollte ausschließlich auf dem Drittsystem gespeichert sein. // ==== 2. Public Key auf dem Server hinterlegen ==== Die Datei **jwt_external_public.pem** muss im Unterordner **keys/** des edp:web-Installationsverzeichnisses abgelegt werden: edpweb/ └── keys/ └── jwt_external_public.pem ==== 3. Konfiguration aktivieren ==== In der **edpweb.ini** muss folgender Block ergänzt werden: [JWT External] Aktiv=1 Nach der Änderung muss der edp:web-Dienst neu gestartet werden. ===== JWT-Format ===== Das Drittsystem muss ein JWT im folgenden Format erzeugen: ==== Header ==== { "alg": "RS256", "typ": "JWT" } Als Signaturalgorithmus wird ausschließlich **RS256** (RSA mit SHA-256) unterstützt. ==== Payload (Claims) ==== { "sub": "mmueller", "funktion": "EL1", "rolle": "abteilung", "ort": "Zentrale", "exp": 1743350400 } ^ Claim ^ Beschreibung ^ Pflicht ^ | **sub** | Benutzername, unter dem der Benutzer in edp:web angemeldet wird | Ja | | **funktion** | Funktionsname, mit dem der Benutzer in edp:web arbeitet | Ja | | **rolle** | Benutzerrolle: **default**, **abschnitt** oder **abteilung** | Ja | | **ort** | Ortsfilter für den Einsatzzugriff (nur bei Rolle //abteilung// erforderlich) | Bedingt | | **exp** | Ablaufzeitpunkt des Tokens als Unix-Timestamp | Ja | **Tipp:** // Die Gültigkeit des Tokens sollte nur wenige Sekunden betragen, da es ausschließlich für den einmaligen Anmeldevorgang genutzt wird. // ===== Aufruf des Endpoints ===== ==== Per HTTP GET ==== https://:/jwt_ext?jwt= Diese Variante eignet sich für eine einfache Weiterleitung aus dem Drittsystem heraus (z.B. als Link oder Redirect). ==== Per HTTP POST ==== POST https://:/jwt_ext Authorization: Bearer ===== Konfiguration anpassen ===== ==== Claim-Bezeichnungen ändern ==== Falls das Drittsystem andere Bezeichnungen für die Claims verwendet, können diese in der **edpweb.ini** angepasst werden: [JWT External] Aktiv=1 FieldUsername=sub FieldFunktion=funktion FieldUserlevel=rolle FieldOrt=ort ^ INI-Feld ^ Standard ^ Beschreibung ^ | FieldUsername | sub | Claim-Name für den Benutzernamen | | FieldFunktion | funktion | Claim-Name für die Funktion | | FieldUserlevel | rolle | Claim-Name für die Benutzerrolle | | FieldOrt | ort | Claim-Name für das Ortsfeld | **Beispiel:** Verwendet das Drittsystem den Claim //role// statt //rolle//, genügt die Anpassung: FieldUserlevel=role ===== Hinweise ===== * Jede externe Anmeldung belegt einen **Lizenzplatz**. Stellen Sie sicher, dass ausreichend Lizenzen vorhanden sind. * Externe Tokens können nicht serverseitig widerrufen werden. Die Gültigkeit wird ausschließlich über den **exp**-Claim im Token gesteuert. * Es wird ausschließlich der Algorithmus **RS256** unterstützt. Tokens mit anderen Algorithmen (z.B. HS256, ES256) werden abgelehnt. * Der Benutzername wird auf maximal **20 Zeichen**, die Funktion auf maximal **24 Zeichen** gekürzt.