Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| edpweb3:jwt_external [2024/12/19 16:11] – [Aufruf des Endpoints] admin | edpweb3:jwt_external [2026/03/29 21:52] (aktuell) – WRAP-Tags entfernt (Plugin nicht verfügbar) tim | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| - | ====== Anmeldung aus Drittsystemen ====== | + | ====== Anmeldung aus Drittsystemen |
| - | Zur Anbindung an Drittsysteme | + | Zur Anbindung an Drittsysteme |
| - | Insbesondere bei größeren | + | Dies ist insbesondere für größere |
| - | Dazu muss dieser zunächst innerhalb der lokalen Konfigurationsdatei aktiviert werden. Im Nachfolgenden ist die Konfiguration beschrieben. | + | Die Authentifizierung erfolgt über ein **JSON Web Token (JWT)**, das vom Drittsystem erzeugt und kryptographisch signiert wird. edp:web prüft |
| - | ===== Konfiguration | + | ===== 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: | ||
| + | - **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 | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | </ | ||
| + | |||
| + | ===== 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: | ||
| + | |||
| + | **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: | ||
| + | |||
| + | < | ||
| + | edpweb/ | ||
| + | └── keys/ | ||
| + | └── jwt_external_public.pem | ||
| + | </ | ||
| + | |||
| + | ==== 3. Konfiguration aktivieren ==== | ||
| + | |||
| + | In der **edpweb.ini** muss folgender Block ergänzt werden: | ||
| - | In der edpweb.ini muss folgender Block ergänzt werden: | ||
| < | < | ||
| [JWT External] | [JWT External] | ||
| Aktiv=1 | Aktiv=1 | ||
| - | ;Angabe des Secrets für das JWT | ||
| - | Secret=... | ||
| </ | </ | ||
| - | Innerhalb des erzeugten JWTs müssen folgende Claims im Payload enthalten sein: | + | Nach der Änderung muss der edp:web-Dienst neu gestartet werden. |
| - | * **sub**: Hier wird der Benutzername angegeben, unter dem der Benutzer in EDP angemeldet wird. | + | ===== JWT-Format ===== |
| - | * **funktion**: | + | |
| - | * **rolle**: Hier muss die jeweilige Benutzerrolle angegeben werden, mit der der Benutzer in EDP Web angemeldet wird. Üblicherweise wären das default, abschnitt oder abteilung. | + | |
| - | * **ort**: | + | |
| - | Die Gültigkeit des JWTs sollte nur wenige Sekunden betragen, da es nur einmalig für die Anmeldung genutzt wird. Die Konfiguration dazu erfolgt auf Ebene des Drittsystems. | + | Das Drittsystem muss ein JWT im folgenden Format erzeugen: |
| - | Bitte beachten Sie darauf, dass das Secret eine ausreichende Komplexität besitzt. | + | ==== Header ==== |
| - | ===== Aufruf des Endpoints ===== | + | < |
| + | { | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | </ | ||
| - | Wenn der Endpoint in der Konfiguration aktiviert wurde, ist er wie folgt erreichbar: | + | Als Signaturalgorithmus wird ausschließlich **RS256** (RSA mit SHA-256) unterstützt. |
| + | |||
| + | ==== Payload (Claims) ==== | ||
| - | ====Aufruf per HTTP GET ==== | ||
| < | < | ||
| - | https:// | + | { |
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| </ | </ | ||
| - | An Stelle von {JWT} muss das JWT angegeben sein. | + | ^ Claim ^ Beschreibung ^ Pflicht ^ |
| + | | **sub** | Benutzername, | ||
| + | | **funktion** | Funktionsname, | ||
| + | | **rolle** | Benutzerrolle: | ||
| + | | **ort** | Ortsfilter für den Einsatzzugriff (nur bei Rolle // | ||
| + | | **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 ==== | ||
| - | ==== Aufruf per HTTP POST ==== | ||
| < | < | ||
| - | https://ip-adresse: | + | https://<adresse>:<port>/jwt_ext? |
| + | </ | ||
| - | Header: | + | Diese Variante eignet sich für eine einfache Weiterleitung aus dem Drittsystem heraus (z.B. als Link oder Redirect). |
| - | ... | + | |
| - | Authorization: | + | ==== Per HTTP POST ==== |
| + | |||
| + | < | ||
| + | POST https://< | ||
| + | Authorization: | ||
| </ | </ | ||
| - | {JWT} | + | ===== Konfiguration anpassen |
| - | ===== Anpassung der Zuordnung der Claims | + | |
| - | Sollte | + | ==== Claim-Bezeichnungen ändern ==== |
| + | |||
| + | Falls das Drittsystem andere Bezeichnungen für die Claims | ||
| < | < | ||
| [JWT External] | [JWT External] | ||
| Aktiv=1 | Aktiv=1 | ||
| - | ;Angabe des Secrets für das JWT | ||
| - | Secret=... | ||
| - | ; | ||
| FieldUsername=sub | FieldUsername=sub | ||
| - | ; | ||
| FieldFunktion=funktion | FieldFunktion=funktion | ||
| - | ; | ||
| FieldUserlevel=rolle | FieldUserlevel=rolle | ||
| - | ; | ||
| FieldOrt=ort | 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: | ||
| + | < | ||
| + | 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. | ||