Download

ERnP Onlineschnittstelle

🟢 TLP:GREEN Das Dokument darf innerhalb der Organisation und an Partner frei weitergegeben werden, aber nicht veröffentlicht werden.

Erzeugt am: . Die jeweils aktuellste Fassung ist hier verfügbar.

Allgemeines

Das ERnP bietet eine HTTP REST API welche XML und JSON als Datenformat unterstützt.
Um diese zu nutzen, muss man im BMI-Portal für die jeweilige Umgebung des ERnP berechtigt sein und die passenden Rollen für die jeweilige Operation haben.

Ansprechpartner

Verantwortlich für das ERnP und SZR

Stammzahlenregisterbehörde

Zuständigkeiten:

Technischer Ansprechpartner beim technischen Dienstleister

Bundesministerium für Inneres
Sektion IV – IT und Service
Direktion für Digitale Services
Abteilung 11 – IKT Anwendungen
Referat b – Verwaltungsanwendungen

Zuständigkeiten:

Rechtliche Grundlagen

Als Rechtsgrundlage dient das E-Government-Gesetz in Verbindung mit der Ergänzungsregisterverordnung in den jeweils gültigen Fassungen.

Nutzungsbedingungen

Grundsätzlich sollten Abfragen sofern möglich nur sequentiell und nicht parallel abgesetzt werden, um die Last aus ERnP Sicht berechenbar zu halten.

Verwendung von Testidentitäten

Aufgrund des unverhältnismäßig hohen Administrationsaufwandes individualisierter Testidentitäten in der Produktivumgebung werden grundsätzlich keine Testidentitäten auf User-Wunsch erzeugt.

Es existieren definierte Testidentitäten in allen Betriebsumgebungen, welche in der Datei testdaten.csv im Schnittstellenpaket enthalten sind. Anhand dieser bereitgestellten Identitäten können User alle gängigen lesenden Usecases im Zuge der Implementierung testen.

Achtung: Diese Personen sind nur für lesende Tests gedacht und dürfen unter keinen Umständen geändert werden! Es sollten bei neuen Personen nie ähnliche Namen vergeben werden, damit sich das Testverhalten (z.B. Ergebnislisten bei Suchen) mit diesen Personen nicht unerwartet ändert.

Für Tests von modifizierenden Operationen (Anlage, Änderung, ...) sollten Vorname+Familienname von angelegten Testpersonen folgende Struktur haben XXX<Applikationskennung><WeitereNamensteile> und dürfen nicht den Eindruck erwecken echte Personen zu sein.

Support Anfragen

Insbesondere technischer Support kann nur gewährleistet werden, wenn bei der Problemmeldung zumindest folgende Daten mitgeteilt werden:

POST https://pvawp.bmi.gv.at/at.gv.bmi.erpsrv-p/srv/rest/beh/person/suchen
Content-Type: application/json
Accept: application/json
Client-Name: MEINE-GUI v1.2.3
Client-Behkz: 111237

{
    "begruendung": "test",
    "suchoptionen": {
        "historisch": "AktuellUndHistorisch",
        "formalisiert": true,
        "sucheMitNamensteilen": true,
        "suchwizard": true,
        "zmr": true
    },
    ...
}

Sollten diese Informationen nicht bereitgestellt werden können oder stattdessen lediglich Screenshots von Fehlermeldungen, Code-Auszüge und dergleichen aus den User-eigenen Implementierungen übermittelt werden, kann Support nur sehr eingeschränkt angeboten werden.

Verbindlichkeit

Durch Implementierung bzw. Anbindung an die ERnP-Schnittstelle und Partizipation im Portalverbund stimmt die jeweilige Organisationseinheit in fachlicher Hinsicht und Softwareentwickler sowie Softwaretester im entsprechenden Ausmaß, den oben beschriebenen Nutzungsbedingungen zu.

Sollte grobes Zuwiderhandeln in einem Ausmaß festgestellt werden, welches den reibungslosen Betrieb des ERnP und nachgelagerter Systeme entgegensteht, so wird dieser Umstand dem Verantwortlichen für das ERnP zur weiteren geeigneten Veranlassung zur Kenntnis gebracht.

Zugriff über den Portalverbund

Das ERnP ist ein REST Webservice hinter dem BMI Portal, weshalb Abfragen über den Portalverbund gemacht werden müssen. Weiterführende Informationen.

Für den Zugriff muss man im BMI-Portal für die jeweilige Umgebung des ERnP berechtigt sein und die passenden Rollen für die jeweilige Operation haben.

URL

Nachdem das ERnP über das Portal aufgerufen wird und unterschiedliche Umgebungen und Nutzerkreise bietet, ist die Zusammensetzung der URL sehr dynamisch. Zu beachten ist, dass dort das 3-Zeichen-Kürzel verwendet wird, weshalb das Register dort ERP heißt. Grundsätzlich sieht die URL so aus: [Portal-Domain]/at.gv.bmi.erpsrv-[Umgebung]/srv/rest/[Nutzerkreis]

HTTP PVP Header

Das ERnP erfordert als Portalapplikation die typischen PVP Header + Chained PVP Header des Ursprungsusers.

Die Toplevel PVP Header werden normalerweise vom Portal angehängt bei dem sich die Clientapplikation via Client-Zertifikat authentifiziert. Sobald ein Request in diesem Portal ankommt, hängt es automatisch die zum Zertifikat hinterlegten PVP Header der Clientapplikation (wie X-AUTHENTICATE-userId, X-AUTHORIZE-roles, ...) an den Request an und leitet ihn weiter.

Die Chained PVP Header müssen hingegen auf jeden Fall von der Clientapplikation selbst mitgeschickt werden (weil das Portal nicht weiß, wer der Ursprungsuser des jeweiligen Requests war).

PVP Chained Header

Laut Portal Verbund Protokoll ist es wichtig den Ursprungsuser zu erkennen und durch die gesamte Aufrufkette an Applikationen durchzureichen, damit auch die letzte Applikation in der Kette weiß, welcher menschliche User den Request ursprünglich ausgelöst hat.

Daher muss die Clientapplikation (welche das ERnP aufruft) die PVP Daten des Ursprungsusers an das ERnP weiterleiten. Wenn die Clientapplikation selbst hinter dem Portal liegt, sollten die PVP Daten des Ursprungsusers ebenfalls in Form von eingehenden PVP Headern vorliegen welche unverändert an den ERnP Request angehängt werden können. Das jeweilige Portal leitet dann den untersten PVP User in der Chain an das ERnP weiter.

Die Daten des Ursprungsusers sind für das ERnP besonders wichtig, weil damit folgende Dinge gemacht werden:

Beispiel für das Weiterleiten der PVP Chain

Das folgende Beispiel bezieht sich nur auf PVP Header. In echten Requests würde man natürlich auch die weiter unten erwähnten ERnP spezifischen Client-Header sowie Accept, Content-Type, ... Header schicken.

Für ein korrektes PVP Chaining müsste die Clientapplikation folgenden PVP Daten des Ursprungsusers einfach 1zu1 als HTTP Header beim ERnP Request mitschicken (die Werte a, b, c, ... sind natürlich nur simple Ersatzwerte für echte PVP Daten eines Users):

X-AUTHENTICATE-participantId: a 
X-AUTHENTICATE-gvOuDomain: b 
X-AUTHENTICATE-mail: c 
X-AUTHENTICATE-userId: d 
X-AUTHENTICATE-gvGid: e 
X-AUTHENTICATE-gvOuId: f 
X-AUTHENTICATE-ou: g 
X-AUTHENTICATE-cn: h 
X-Version: 1.8 

Sobald diese Header an das Portal geschickt werden, ermittelt es aufgrund des Client Certificates (welches ebenfalls geschickt werden muss) die PVP Daten und Rollen der Clientapplikation (in diesem Bsp sind es nur Dummy-Daten) und leitet den Request mit angepassten Headern ans ERnP weiter.

Im weitergeleiteten Request sind die PVP Daten der Clientapplikation als Toplevel PVP Daten ersichtlich und die Daten des Originalusers stehen als PVP Chain im Request (erkennbar am X-01- Prefix).

Das ERnP kennt so den Ursprungsuser und kann diesen protokollieren bzw an das ZMR weiterleiten:

X-AUTHENTICATE-participantId: AT:B:112
X-AUTHENTICATE-cn: XXXAPP Applikationsbenutzer
X-AUTHENTICATE-gvOuId: AT:B:112-000
X-AUTHENTICATE-Ou: OU Appluser
X-AUTHENTICATE-UserID: xxxappy@abc.at
X-AUTHORIZE-roles: ERnP-XYZ-Rolle
X-AUTHENTICATE-gvSecClass: 3
X-Version: 1.8

X-01-AUTHENTICATE-participantId: a
X-01-AUTHENTICATE-gvOuDomain: b
X-01-AUTHENTICATE-mail: c
X-01-AUTHENTICATE-userId: d
X-01-AUTHENTICATE-gvGid: e
X-01-AUTHENTICATE-gvOuId: f
X-01-AUTHENTICATE-ou: g
X-01-AUTHENTICATE-cn: h

Schnittstellendokumentation

Im Folgenden wird die Schnittstelle beschrieben, sodass ein Zugriff mithilfe eines beliebigen HTTP Clients implementiert werden kann.

Während hier allgemeine Konzepte beschrieben werden, kann ein Schnittstellenpaket für den jeweiligen Nutzerkreis angefordert werden, welches mehr Details und Hilfsmittel für die Implementierung der Client-Applikation liefert.

Allgemeine Validierung für Strings

Grundsätzlich akzeptiert das ERNP UTF-8.
Nachdem darin auch viele unerwünschte Zeichen (z.B. control characters) enthalten sind, gibt es allgemeine Validierungsregeln die für alle Strings der API gelten:

Datenformat

Das ERnP unterstützt primär JSON als Datenübertragungsformat, akzeptiert in den meisten UseCases bis auf weiteres aber auch auch XML (wobei der XML Support vermutlich irgendwann auslaufen wird). Der im Schnittstellenpaket enthaltene Java Beispiel-Client kann für beide Übertragungsformate konfiguriert werden.

Die JSON-Struktur ist so weit es geht an die XML-Struktur angelehnt mit folgenden Besonderheiten:

Striktheit

Die Empfehlung ist: bei Requests an das ERnP möglichst strikt sein, Responses aber möglichst tolerant parsen. So ist man zukunftssicher bezüglich neuer ERnP Anpassungen.

Das heißt auch, dass Responses nie gegen das Ernp.xsd Schema validiert werden sollten. Es gibt teilweise sehr alte ERnP-Personen, die sich nicht an alle Regeln halten; trotzdem wollen wir deshalb die für die restlichen 99,99% gültigen Regeln nicht aufweichen (z.B. haben manche alte ERnP Personen keine Begründung, obwohl diese seit Jahren Pflicht wäre). Außerdem würde eine Schemavalidierung fehlschlagen sofern in ERnP Responses neue Felder eingefügt werden, selbst wenn der eigene Client diese gar nicht benötigt.

Auch im Rahmen der Meldegesetznovelle gab es Fälle die für eine tolerante Responseverarbeitung sprechen (der Beispielclient Client setzt diese Empfehlungen um):

  1. neue Geschlecht-Werte für das existierende Geschlecht-Feld: Das Feld Geschlecht der ERnP API wurde deshalb zu einem String (statt einer enum). Nur Clients die beliebige (heute noch unbekannte) Werte für den String verarbeiten können, sind zukunftssicher (mehr dazu im nächsten Abschnitt Enumerations)
  2. neue Felder wie "Sonstiger Name": Clients die unbekannte Felder ignorieren haben mit neuen Feldern keine Probleme. Java mit XML via JAXB macht das standardmäßig, Jackson (für JSON) wirft standardmäßig Fehler, weshalb empfohlen wird das DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES zu disablen.
  3. Felder die von Einzelelementen zu Listen werden wie Anschrift: XML hat den Vorteil, dass eine Liste mit 1 Element genauso aussieht wie ein einzelnes Element. Bei JSON kommen in dem Fall Array-Klammern hinzu was nicht rückwärtskompatibel ist. Daher empfiehlt es sich bei Jackson das DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS zu enablen. Dadurch wird ein Array mit 1 Element so behandelt wie ein Element ohne Array-Klammern. Das ERnP kann dann in einer Übergangsphase garantieren, dass die Liste nur 1 Element enthält, was Clients Zeit zur Umstellung gibt. Der umgekehrte Fall (Listen zu Einzelelement) erfordert, dass das Jackson DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY enabled wird. Dann gibt es auch kein Problem, wenn im JSON auf einmal die Array-Klammern fehlen.

Enumerations

Im ERnP gibt es einige enumerations, jedoch hat sich am Beispiel des Geschlechts gezeigt, dass sie manchmal unerwartet geändert bzw erweitert werden müssen.

Deshalb wurden alle enumerations im xsd stattdessen als union aus der jeweiligen enum und string abgebildet; das entspricht einer erweiterbaren enum (= ein String mit den derzeit bekannten Ausprägungen).
Echte enumerations werden nur genutzt, wenn sie ausschließlich eingehende Daten betreffen (wenn eine enum niemals vom ERnP returniert wird, kann es auch keine Probleme mit der Rückwärtskompatibilität geben).

Für den Beispielclient bedeutet das, dass statt enums Strings in die Klassen generiert werden und die Verwendung dadurch leider etwas unbequemer wird. Allerdings bieten wir für alle enumerations eine Java enum Klasse an (z.B. Geschlecht.java) mit der man auf die derzeit bekannten Werte über die .value() Methode zugreifen kann.

ACHTUNG: Nutzt man diese Hilfsklassen z.B. via Geschlecht.fromValue(personendaten.getGeschlecht()) ist unbedingt erforderlich den Aufruf in ein try/catch zu packen und die Exception (welche geworfen wird, wenn kein bekannter enum Wert gefunden wird) entsprechend zu behandeln (z.B. loggen, dass ein unerwarteter Wert vom ERnP zurückgekommen ist und null setzen). Nur dann funktioniert das eigene Service auch problemlos mit neuen enum-Werten.
Falls man die enum Werte nur anzeigt, empfiehlt es sich die Hilfsklassen nicht zu nutzen, dann funktioniert die Anzeige auch für zukünftig neue Werte automatisch.

HTTP Header

Request-Header

Neben den zuvor erwähnten PVP HTTP Headern für die Token-Chain, müssen bei jedem Request folgende 2 HTTP Header mitgeschickt werden:

Zusätzlich können folgende 2 Header geschickt werden, um mögliche Fehleranalysen zu vereinfachen:

TPA WFLID Header

Falls die ERNP Client-Applikation TPA Logs schreibt und somit bereits eine WFLID erzeugt hat, welche vom ERnP für TPA Logs weiterverwendet werden soll, kann diese über den Header TPA-WFLID übergeben werden. Der Wert muss das Pattern [a-zA-Z0-9\-]{1,64} erfüllen und wird, falls vorhanden, für ERnP TPA Logs gesetzt. Falls der Header fehlt, erzeugt das ERnP für TPA Logs selbstständig passende UUIDs als WFLID.

Achtung: Alle Header Values dürfen nur US-ASCII Zeichen enthalten (keine Umlaute etc).

Response-Header

Der Response liefert einige nützliche ERnP-spezifische HTTP Header:

Fehlerbehandlung

Das ERnP liefert passende HTTP Statuscodes aus, d.h. 200-299 wenn alles OK ist, 400-499 für Client Fehler und 500-599 für Serverfehler.

Ruft man z.B. eine nicht existierende URL auf bekommt man einen "404 Not Found" vom ERnP.

Hat das ERnP weitere Informationen über den Fehler (z.B. bei Validierungsfehler was genau schiefgegangen ist), so steht diese im Response (siehe Beispiel weiter unten).

ERnP Historisierung

Das ERnP erzeugt für alle Personen-Anpassungen ein technisches Protokoll und für die meisten Operationen auch weiterhin historisch gültige Datensätze.

Für Schnittstellennutzer ist die Historie in erster Linie relevant, weil dadurch Personen auch mit vorherigen Daten (wie z.B. alten Familiennamen) gefunden werden können.

Unterschied zwischen Ändern und Korrigieren

Ein konkretes Beispiel einer historisierten Änderung wäre eine Person mit dem Familiennamen Müller, welcher anschließend (z.B. aufgrund einer Eheschließung) auf Hofer geändert wurde.

Nach der Änderung kann, sofern die Suchoption SucheHistorisch z.B. den Wert AktuellUndHistorisch hat, die Person sowohl mit dem Familiennamen Müller als auch mit dem Familiennamen Hofer gefunden werden, obwohl die Person aktuell nur mehr Hofer heißt.

Im Gegensatz zur erwähnten Ändern-Operation bietet das ERnP auch die Option Korrigieren, welche zwar ebenfalls die Daten wie gewünscht anpasst, jedoch keine Historie erzeugt. Korrekturen werden typischerweise nur gemacht, wenn die vorherige Eingabe z.B. einen Tippfehler hatte. Hat man unabsichtlich Müler angelegt, wollte aber Müller schreiben, korrigiert man den Eintrag, sodass nach der Korrektur die Person mit dem vorherigen Familiennamen Müler nicht mehr gefunden werden kann.

Achtung: eine Korrektur darf nur von jener Behörde durchführt werden, die den zu korrigierenden Datensatz zuletzt bearbeitet bzw. angelegt hat.

Beendigung

Beendigungsoperationen historisieren ebenfalls Datensätze. Falls gewünscht ist auch beendete Personen zu finden, so kann wie zuvor erwähnt die Option SucheHistorisch mit dem Wert AktuellUndHistorisch genutzt werden.

Metadaten für die Historisierung

Schnittstellenpaket

Das zuvor erwähnte Schnittstellenpaket besteht aus folgenden Teilen:

Nutzerkreis Dokumentation

Die im Schnittstellenpaket enthaltene Datei Nutzerkreis-XYZ.html enthält erweiterte Dokumentation und Beispiele für diesen Nutzerkreis.

Die Struktur der Beispiele ist beim Request immer HTTP Operation (z.B. POST), die zu verwendende URL und der HTTP Request/Response Inhalt (=Payload). Beim Response steht der HTTP Response Status und ebenfalls der Payload.

Beim 1. Beispiel stehen außerdem die HTTP Header für Request+Response. Nachdem diese überall deckungsgleich sind, wurden sie bei den weiteren Beispielen weggelassen.

Außerdem gibt es einen Einleitungstext der den genauen Ablauf der Operation und der Objekte beschreibt (z.B. welche Metadatenfelder gibt es, was muss ich alles in Änderungsblöcken schicken, um nicht unabsichtlich Inhalte zu löschen, etc).

OpenAPI

Die OpenAPI Specification ist ein Standard um HTTP REST APIs zu beschreiben (grob vergleichbar mit einem WSDL für SOAP APIs).

Falls Sie im Portal entsprechend berechtigt sind, kann für das ERnP eine aktuelle OpenAPI Spezifikation mit HTTP GET auf [Portal-Domain]/at.gv.bmi.erpsrv-[Umgebung]/srv/rest/[Nutzerkreis]/openapi/openapi.json abgerufen werden.

Aus diesem File kann man auch direkt Client Code generiert werden wie z.B. unter https://swagger.io/tools/swagger-codegen/ oder https://github.com/openapitools/openapi-generator beschrieben wird.

Alternativ dazu, kann man auch die XSD Files nutzen, um z.B. in Java mit JAXB die HTTP Payload Objekte zu generieren. Diese schickt man dann mit einem beliebigen HTTP Client and die jeweilige URL.

Beispielclient

Das Schnittstellenpaket enthält das Verzeichnis Beispielclient welches 2 Subdirs hat:

Achtung: Vor der Verwendung müssen unbedingt die nötigen Anpassungen wie Portal-ClientCert und ERnP Client HTTP Header vorgenommen werden!

Wichtige Info zum Verwendungszweck

Der Beispielclient dient in erster Linie als Implementierungshilfe und zum Absetzen erster Testrequests, jedoch gibt es für den Client keinen Changelog, Support oder Garantien irgendeiner Art!

Wird z.B. ein neues optionales Suchfeld in die ERnP API aufgenommen (was aus API-Sicht rückwärtskompatibel ist), können sich die generierten Java Klassen des Beispielclients durch das neue Feld im Konstruktor rückwärtsinkompatibel ändern. Das muss man bedenken, wenn man auf eine neue Version des Beispielclients wechselt (oder man bleibt bei rückwärtskompatiblen API Änderungen bei der alten Beispielclient Version, weil die alten Requests weiterhin funktionieren).

Wenn man damit leben kann, spricht nichts dagegen den Client in Teilen oder als Ganzes auch produktiv einzusetzen.

Sinnvolle Nutzungsvarianten des Beispielcodes sind:

  1. Wenn man selbst Code aus dem OpenAPI File generiert, wird man wenig bis nichts vom Beispielclient nutzen. Falls JSON verwendet wird, sollte man die Object-Mapper-Settings zu übernehmen bzw äquivalente Settings nachzubilden, wenn man kein Jackson nutzt. Damit ist sichergestellt, dass Requests+Responses so tolerant wie möglich aber so strikt wie nötig geparsed werden (siehe Abschnitt Striktheit weiter oben).
    • Für Jackson werden die Dependencies jackson-annotations, jackson-core, jackson-databind, jackson-datatype-jsr310 benötigt. Falls man XML nutzt, muss man eine JAXB Runtime ergänzen, falls Java11+ genutzt wird.
  2. Wenn man Jackson oder JAXB nutzt um den HTTP Payload zu konvertieren, kann man außerdem die generierten DTO Klassen nutzen, welcher sicherstellen, dass das Ergebnis JSON/XML valide ist.
  3. Wenn einem HttpURLConnection.java als HTTP Client nicht stört, kann man auch den gesamten Beispielclient nutzen.

Komponenten

Wechsel von Apache + jar Files zu HttpURLConnection + source Files

Früher hat der Beispielclient den Apache HttpClient (gemeinsam mit einer BMI-Hilfslibrary) und zugehörige jar Files ausgeliefert.

Nachdem dadurch das Schnittstellenpaket unnötig groß wurde und manche Nutzer Probleme wegen strikter Firewalls/Virenscanner berichtet haben, werden inzwischen nur noch simple Java Files ausgeliefert die man bei Bedarf anpassen und kompilieren kann.

Um Dependencies zu reduzieren wurde der Apache HttpClient durch HttpURLConnection.java ersetzt und slf4j entfernt.

Außerdem wurden manche Klassen umbenannt oder in andere Packages verschoben, damit sie nicht im selben Package wie generierte Klassen liegen.

Man kann den alten Client falls gewünscht aber in die neue Struktur integrieren, indem man das Interface ErnpReqSender implementiert und dort Requests via Apache HttpClient absendet.
Zu Beachten ist, dass ErnpCallException nicht mehr wie bisher HttpCallExceptionWithResponse extended, wodurch manche catch-Blöcke sich evtl anders verhalten. Um sicherzustellen, dass sich alles wie bisher verhält, sollte man die Programmlogik nach catch(HttpCallException* durchsuchen, weil catches der 3 Exceptions deren Name mit HttpCallException beginnt zukünftig keine ErnpCallException catchen!