ein Service der DDS ()info
🟢 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.
Das SZR ist ein Web-Front-End zum Zentralen Melderegister (ZMR) und Ergänzungsregister natürlicher Personen (ERnP), um bereichsspezifische Personenkennzeichen (bPK) berechnen zu können.
Um Zugriff darauf zu erhalten, muss man im BMI-Portal für die jeweilige Umgebung des SZR berechtigt sein und die passenden Rollen für die jeweilige Operation haben.
Es wird eine moderne JSON HTTP/REST API angeboten, als auch eine legacy SOAP API angeboten, welche keine neuen Features mehr erhalten wird. Neue SZR Benutzer werden ausschließlich auf der REST API angebunden.
Es erfolgt keine Speicherung personenbezogener Daten in der Anwendung, sondern es wird mit personenbezogenen Daten lediglich eine Suche im ZMR und ERnP gemacht. Wenn diese Suche ein eindeutiges Ergebnis liefert, so wird die Stammzahl der gefundenen Identität anhand ihrer Basiszahl im ZMR oder ERnP berechnet und daraus ein oder mehrere bPKs abgeleitet.
Stammzahlenregisterbehörde
Zuständigkeiten:
Bundesministerium für Inneres
Sektion IV – IT und Service
Direktion für Digitale Services
Abteilung 11 – IKT Anwendungen
Referat b – Verwaltungsanwendungen
Zuständigkeiten:
Als Rechtsgrundlage dient das E-Government-Gesetz in Verbindung mit der Stammzahlenregisterbehördenverordnung sowie der Ergänzungsregisterverordnung in den jeweils gültigen Fassungen.
Voraussetzung für die technische Freischaltung des Webservices in einer bestimmten Rolle ist ein genehmigter Antrag auf Ausstattung einer Datenverarbeitung mit bPK.
Ein Antrag auf bPK-Ausstattung kann jederzeit online erfolgen. Dazu muss man sich mittels eID unter folgendem Link einloggen: BürgerPortal.
Sollte kein eID bzw. kein Äquivalent zur Verfügung stehen, kann ein Antrag ebenso per Mail an bmi-ikt-szr-postfach@bmi.gv.at übermittelt werden.
Dazu sind entsprechende Formulare für bPK und vbPK unter folgendem Link vorhanden: Formulare Stammzahlenregisterbehoerde.
Fragen zur Antragstellung sind in diesem Fall ebenso an bmi-ikt-szr-postfach@bmi.gv.at zu richten.
Am Ende des Antragsprozesses wird das BMI per Mail über den genehmigten Antrag informiert und es folgt die technische Umsetzung.
Grundsätzlich dürfen Abfragen nur sequentiell und nicht parallel abgesetzt werden, um die Last aus SZR Sicht berechenbar zu halten.
Es sollten immer listenbasierte Operationen wie bpk/suche (REST) oder GetBpks (SOAP) genutzt werden, da die gesamte Ausstattung dann nur einen Bruchteil der Zeit einer Ausstattung mit der Einzeloperation GetBpk in Anspruch nimmt.
Es ist typischerweise optimal 100 Suchdaten pro Request zu schicken:
Für größere Mengen an auszustattenden Daten (mehrere 10.000 bPK in einem kurzen Zeitraum) ist immer eine koordinierte Vorgehensweise erforderlich. Dazu bitte den oben erwähnten technischen Ansprechpartner kontaktieren.
Vorab: Normalerweise sind solche Abfragen Mo-Fr 17 Uhr bis 6 Uhr früh bzw Sa-So ganztags durchzuführen. Gegebenenfalls ist eine asynchrone BATCH-Verarbeitung in einfacher tabellarischer Form (Comma Separated File) ein geeigneteres Mittel für diesen Usecase.
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 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.
Insbesondere technischer Support kann nur gewährleistet werden, wenn bei der Problem Meldung zumindest der HTTP Request Inhalt/Payload (besser auch HTTP Header und URL), die betroffene Betriebsumgebung und der exakte Anfragezeitpunkt mitgeteilt werden.
HTTP Response Informationen sind ebenfalls hilfreich (zur Überprüfung ob der so aus dem SZR rausgegeben wurde oder z.B. am Weg über diverse HTTP Proxy oder Portal Server verändert wurde).
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.
Durch Implementierung bzw. Anbindung an die SZR-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 SZR und nachgelagerter Systeme entgegensteht, so wird dieser Umstand dem Verantwortlichen für das SZR zur weiteren geeigneten Veranlassung zur Kenntnis gebracht.
Das SZR ist ein 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 SZR berechtigt sein und die passenden Rollen für die jeweilige Operation haben.
Nachdem das SZR über das Portal aufgerufen wird ist die Zusammensetzung der URL dynamisch. Grundsätzlich sieht die URL so aus:
Das SZR erfordert als Portalapplikation die typischen PVP Header + Chained PVP Header des Ursprungsusers.
Die Funktionsweise von PVP kann in der PVP 1.9 Dokumentation nachgelesen werden
Die Toplevel PVP Header werden normalerweise vom Portal angehängt, bei dem sich die Clientapplikation via Client-Zertifikat authentifiziert hat. Sobald ein Request im Portal ankommt, hängt es automatisch die zum Zertifikat hinterlegten PVP Header der Clientapplikation 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).
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 SZR aufruft) die PVP Daten des Ursprungsusers an das SZR weiterleiten. Wenn die Clientapplikation selbst hinter dem Portal liegt, sollten die PVP Daten des Ursprungsusers ebenfalls in Form von eingehenden PVP Headern vorliegen welche an den SZR Request angehängt werden können. Das jeweilige Portal leitet dann den untersten PVP User in der Chain an das SZR weiter.
Möglicherweise ist ein Transformationsschritt nötig, damit die Clientapplikation die eingehenden Daten an das SZR weiterleiten kann:
Die Daten des Ursprungsusers (=die PVP Chain) sind für das SZR besonders wichtig, weil damit das dahinterliegende Register (ERnP oder ZMR) protokolliert, wer schlussendlich die Suche bzw Operation abgesetzt hat.
Beispiele für das Weiterleiten der Chain sind weiter unten in dieser Dokumentation.
Eine bPK (bereichsspezifische Personenkennzeichen) ist eine eindeutige Identifikation für eine Person und einen Bereich.
Um eine bPK zu berechnen, wird eine Anfrage an das SZR übermittelt, welches mit den angegebenen Suchdaten eine Suche im ZMR und im ERnP durchführt.
Führt diese Suche zu einem eindeutigen Ergebnis, wird die Basiszahl (= ZMR-Zahl bei ZMR Personen und Ordnungsnummer bei ERnP Personen) der Person zu einer bereichsunabhängigen Stammzahl verschlüsselt und anschließend um den Bereich ergänzt und mittels mathematischer Einwegfunktion (Hashfunktion) zur bPK umgewandelt. Daraus ergibt sich, dass eine bPK nicht auf eine Person rückführbar ist.
Außerdem können bPKs auch verschlüsselt (als vbPK) beim SZR abgefragt werden. Das macht man normalerweise, wenn man nicht selbst mit der bPK arbeitet, sondern diese an einen Dritten weiterleitet. Die Verschlüsselung erfolgt mit dem öffentlichen Schlüssel (Zertifikat) der Empfängerapplikation. Nur diese ist mit Ihrem privaten Key in der Lage die vbPK zu entschlüsseln, um dann das unverschlüsselte bPK zu erhalten.
Achtung: bPKs aus der Produktions-Umgebung unterscheiden sich immer von bPKs anderer Umgebungen, selbst wenn sie zur exakt gleichen Person ausgestellt werden. Darum spricht man hier von PROD-bPKs und in anderen Umgebungen (e, t, a, b) von TEST-bPKs
Das Verwaltungskennzeichen (kurz: VKZ) ist ein, einer Organisationseinheit der öffentlichen Verwaltung zugeordnetes, eindeutiges Identifikationszeichen.
Nach einem genehmigten Antrag auf Erstausstattung mit bPKs durch die Stammzahlenregisterbehörde wird im Stammzahlenregister für ein bestimmtes Verwaltungskennzeichen (VKZ) die Abfrage einer unverschlüsselten bPK des der Datenanwendung zugeordneten Bereichs lt. Bereichsabgrenzungsverordnung ermöglicht.
Das SZR prüft, ob das VKZ für den gewünschten Bereich die bPK anfragen darf.
Eine unverschlüsselte bPK bleibt für eine Person innerhalb eines Verwaltungsbereiches immer gleich und ist immer 28 Zeichen lang. Unverschlüsselte bPK dienen wie bereits erwähnt, der Speicherung und Verwendung bei der ausgestatteten Organisation und sind nicht dafür vorgesehen, an Dritte weitergegeben zu werden (um sie beispielsweise als „gemeinsamen Identifier“ zu verwenden).
Details über die Berechnung einer bPK können unter folgendem Link nachgelesen werden: Bereichsspezifische Personenkennzeichen (bPK)
Eine bPK gehört immer zu einem Bereich der via Bereichskennung eindeutig identifiziert werden kann.
Die Bereichskennung gibt es als Langform inkl Präfix (z.B. urn:publicid:gv.at:cdid+ZP oder urn:publicid:gv.at:ecdid+BBA-STA+AS) oder als Kurzform (z.B. ZP oder BBA-STA+AS)
urn:publicid:gv.at:cdid+
Bsp: urn:publicid:gv.at:cdid+ZP für den Bereich "zur Person"
urn:publicid:gv.at:wbpk+
Zusammen mit der Registerkennung und der Registernummer (z.B. Firmenbuchnummer) ergibt sich die vollständige Bereichsangabe.
Bsp: urn:publicid:gv.at:wbpk+XFN+1234i für das Firmenbuch oder urn:publicid:gv.at:wbpk+XZVR+1234 für das Vereinsregister
urn:publicid:gv.at:ecdid+ bzw. urn:publicid:gv.at:ewbpk+
Der Präfix entspricht der jeweiligen unverschlüsselten Variante, hat aber ein e vorangestellt.
Nach dem Präfix folgt das Verwaltungskennzeichen (VKZ) und der Bereich. Als Trennzeichen dient dabei jeweils ein + (Plus).
Bsp: urn:publicid:gv.at:ecdid+BBA-STA+AS für eine verschlüsselte bPK der Statistik Austria mit dem VKZ BBA-STA und dem Bereich AS für Amtliche Statistik oder urn:publicid:gv.at:ewbpk+XFN-12345i+XFN+12345i für eine verschlüsselte wbpk
Achtung: Fragt man über SOAP verschlüsselte Bereiche ab, nutzt man das <Target> Element, welches das Ziel-VKZ und den Ziel-Bereich mit unverschlüsseltem Bereichspräfix spezifiziert! An anderen Stellen (z.B. im SOAP Response oder bei vBpks als Identification) wird jedoch wie üblich das verschlüsselte Präfix genutzt
Verschlüsselte bPKs sind ohne Entschlüsselung nicht direkt verwendbar. Sie werden abgefragt und später an ein Ziel (z.B. eine andere Organisation) weitergeleitet, wo sie entschlüsselt und verwendet werden können.
Fragt man eine bestimmte VKZ+Bereich Kombination vom SZR mehrfach ab, kommt immer eine andere vbPK zurück, selbst wenn nach der Entschlüsselung dieselbe bPK enthalten ist.
Es handelt sich daher um eine Transportverschlüsselung, die sicherstellt, dass nur das Ziel mit der vbPK als Identifier arbeiten kann, nicht jedoch die Organisation welche die vbPK vom SZR erhalten hat
Damit das SZR bPKs für eine bestimmte Kombination aus VKZ und Bereich verschlüsseln kann, muss im SZR zuvor ein entsprechendes Verschlüsselungszertifikat für diese Kombination hinterlegt worden sein.
Achtung: Das VKZ als Teil eines "verschlüsselten Bereichs" ist somit essentiell, weil es festlegt, wer der Empfänger der vbPK ist. Nur dieser kann die vbPK auch entschlüsseln. Spricht man von einer "verschlüsselten ZP bPK" ist die Aussage somit unvollständig. Korrekt wäre "die für BMI verschlüsselte ZP bPK" oder "die verschlüsselte BMI+ZP bPK"
Die Verschlüsselung von bPKs passiert mittels RSA-Verfahren mit OAEP-Padding.
Neue Zertifikate müssen nach Stand der Technik als 4096bit Public-Zertifikat im PEM-Format erstellt werden und anschließend als Textdatei via Mail an bmi-ikt-szr-postfach@bmi.gv.at übermittelt werden.
Sofern Schlüsselmaterial bereits länger im SZR gespeichert ist, ist davon auszugehen, dass zum Hinterlegungszeitpunkt der Schlüssel mit einer Länge dem damaligen Stand der Technik entsprechend hinterlegt wurde (Mindestlänge sind 1024bit). Auf diesen Umstand sollte aus technischer Perspektive frühzeitig Rücksicht genommen werden.
Die Länge einer vbPK ist abhängig vom verwendeten Schlüssel.
Sobald man eine vbPK entschlüsselt bekommt man z.B. folgendes Ergebnis:V1::urn:publicid:gv.at:cdid+T1::MxK82jxY9+vZg/25J44lMNg+FJY=::2025-02-25T14:12:44
oder allgemeiner gesagtV1::<Bereich>::<bPK>::<Verschlüsselungszeitpunkt>
Dabei handelt es sich um einen String der mehrere Bestandteile enthält, die mit :: getrennt werden
V1 fixer Wert (steht für Version 1, es ist aber sehr unwahrscheinlich dass sich das jemals ändert)<Bereich> Die Langform der Bereichskennung der entschlüsselten bPK<bPK> Die entschlüsselte bPK<Verschlüsselungszeitpunkt> Der Zeitpunkt der Verschlüsselung im Format YYYY-MM-DDThh:mm:ssAchtung: Wie erwähnt sind 2 abgefragte vbPKs niemals gleich. Das liegt einerseits daran, dass der Verschlüsselungszeitpunkt in der vbPK enthalten ist, anderseits daran, dass das OAEP-Padding blockorientiert arbeitet und fehlende Zeichen auf die Blocklänge durch zufällig Werte auffüllt.
Als Orientierungshilfe ist hier ein Java-Beispielcode wie vom SZR gelieferte vbPKs typischerweise entschlüsselt werden können:
KeyStore keystore = KeyStore.getInstance("JKS");
try (InputStream stream = new FileInputStream("C:/fremdbpks.jks")) { // Pfad zu JKS mit dem Key zum Entschlüsseln
keystore.load(stream, "kspw".toCharArray()); // kspw muss durch das Keystore Passwort ersetzt werden
}
PrivateKey key = KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(keystore.getKey("alias", "pw".toCharArray()).getEncoded())); // alias ist der Alias des Keys im Keystore und pw das Passwort
Cipher ci = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
ci.init(Cipher.DECRYPT_MODE, key);
String vbpk = "fvm+zz/XXu5KzRz3d7IdQc5RNqICQYI9qg...4kCYkr53HTWWrKF2Q==";
String bpk = new String(ci.doFinal(Base64.getDecoder().decode(vbpk)), StandardCharsets.UTF_8);
Fragt man z.B. mit folgenden Personendaten:
wGZUpYj8rz7XNxVCYtDlN0lK24Y=
R4LUrsRoiWqIsMAYDnbsMxo528R3U87Aa80+KcOWHsEphcx3OOXlEaO034RsQBLLJFR+dM1bWhityc/8QBtD59BwXnY0NxFs0go0Uy+cx0GmGNY1lQVg24cu40azxtQ9VAil4Z+EmRLoyjz9ASkDcQxkGY1FukB3maJl3qw6B2M=
wW00S7Biy23G31pE3dDjfQ8sjDdDJ1NgrKTgwQ+tJnLKph/pxKd0xmhxLlN/3qCpivqBwo93cHeL37fIq/rwVQV2q4Th/QziOOF/kcEUbSVEmjon4naXTm8OythtKg1JAs/23dqhpfuLW8P4nhsVQlFGvzGKsFB2FaaJJHk9NeCpoNhfx3L0V+17mJOuR+X0l+1bTyFBeFLbdE69QeCeVLtj5wUPiWW/LqOL62kjOgEp6XdwZsDT+WyUqcx18bpcjG5vOMjH671G5sqK6fVbZxyJY3GHsS3UBLtwn8KPxivKbAZq1PDVCXHqQS7mwJoRo5m18k7kFomNLGVDs0JePXAXhy7+Ewh29PlvzdwNuZr/aMZ/0/L5mzS8v/pOFwBIAj12fGdbNd6dZ7pcTYQLHIatJCJmnHCq/h8hP6MAzmgh/IihZbbkU6u9xxe6skqyR1LGOeDWwTGSUuUp9Om8p8dwGBYv5FQlEGjFx0m8H86w2qgpQLS5uNXUdrSTKHO0TI5vUgg9q7L4Xy3EVMQfWZJkZil+TyhWrEAMQ+tEE+0XDHY1glNhbHMrsLxVvRsrUBmtlRYzOy5+nLFX4MQGBOuelJJqaoT2ospdI0nTG0DYLL3SIdietymzHSz5OiftUI0pCiTqJFasX9AFygzxs0bHQddXrQLcC3oEv7l4H3Y=
Normalerweise ändert sich die bPK einer Person nicht, weil sie auf ihrer ZMR-Zahl bzw Ordnungsnummer basiert und diese unveränderbar ist.
Allerdings bieten das ZMR und ERnP eine Funktion um 2 Personen zusammenzuführen (=zu kitten). Das kann z.B. aufgrund der Bereinigung einer Doppelanlage sein.
Dabei wird eine Person (=Quellperson) auf eine andere Person (=Zielperson) zusammengeführt. Die Zielperson kann danach als Quellperson weiterer Kit-Operationen dienen.
Sucht man danach im SZR mit Daten der Quellperson, wird diese gefunden und über die Kitverfolgung zur finalen Zielperson verfolgt für die dann bPKs berechnet und ausgeliefert werden. Diese unterscheiden sich von bPKs der Quellperson nach der eigentlich gesucht wurde.
Beispiel eines zeitlichen Ablaufs:
Schickt man eine bPK der Quellperson als Identification, funktioniert das weiterhin und auch hier gehören die vom SZR returnierten bPKs zur Zielperson.
D.h. wenn man eine bPK als Identification schickt, kann im Response eine andere bPK (die der Zielperson) stehen.
Im Folgenden werden allgemeine Schnittstellen-Konzepte erklärt.
Zusätzlich kann ein Schnittstellenpaket angefordert werden, welches eine technische Schnittstellendokumentation enthält.
Achtung: Die SZR Version ist nicht an die Version (=Erstellungszeitpunkt) dieser Dokumentation oder des Schnittstellenpakets gekoppelt.
Indem man sich an die folgenden Best Practices für Clients hält, stellt man sicher, dass fast alle SZR Releases keine Auswirkung auf den eigenen Client haben und dieser unverändert weiter läuft.
Grundsätzlich werden Schnittstellenänderungen im SZR sofern es möglich ist, immer rückwärtskompatibel gestaltet. Neue Funktionen/Inhalte werden daher gegebenenfalls hinter neue optionale Request Parameter gelegt, sodass sie nur bei Bedarf abgefragt werden.
Die häufigste rückwärtskompatible Änderung, ist das Hinzufügen neuer Felder im Response. Daher ist wichtig, dass Clients Responses nicht zu strikt parsen und unbekannte Felder ignorieren!
Falls z.B. aufgrund gesetzlicher Anforderungen wie der Meldegesetznovelle doch rückwärtsinkompatible Änderungen nötig werden, wird das rechtzeitig über den SZR RSS Feed angekündigt und diese Dokumentation angepasst.
Wichtig für die Stabilität von Clients ist, dass sie sich an Postel’s Law (=Robustness Principle) halten:
Be conservative in what you do, be liberal in what you accept from others
Anders gesagt: Bei Requests an das SZR möglichst strikt an die SZR API Spec halten, Responses aber möglichst tolerant parsen.
Somit vermeidet man proaktiv Probleme durch zukünftige SZR Anpassungen und stellt sicher, dass auch Clients die aus veralteten OpenAPI Specs generiert wurden, problemlos weiter funktionieren.
Die Umsetzung der Meldegesetznovelle zeigt Beispiele, wieso eine tolerante Responseverarbeitung sinnvoll ist:
Zusätzlich sind folgende Regeln sinnvoll für die Robustheit von Clients:
Im SZR werden echte enumerations nur genutzt, wenn sie ausschließlich in Requests vorkommen. Sobald eine enum im Response vorkommt, wird sie immer als String abgebildet (man kann nie 100%ig garantieren dass keine neuen Werte dazukommen).
Wichtig ist, dass Clients, welche die enum Werte verarbeiten, auch mit heute noch unbekannten Werten umgehen können (also z.B. nicht abstürzen weil ein heute noch unbekanntes Geschlecht retour kommt)
In der OpenAPI Dokumentation werden solche enums als x-extensible-enum abgebildet (ist eine relativ verbreitete OpenAPI Extension für den Usecase). Bsp:
"geschlecht" : {
"type" : "string",
"x-extensible-enum" : [ "Männlich", "Weiblich", "Unbekannt", "Inter", "Divers", "Offen", "Keine Angabe" ]
},
Weil SOAP APIs nicht mehr dem aktuellen Stand der Technik entsprechen, bietet das SZR auch eine moderne REST API an.
Folgende Verbesserungen wurden umgesetzt:
Aufgrund der umfangreichen, listenbasierten Suchdaten, nutzt die REST API für die /bpk/suche Operation HTTP POST.
HTTP GET würde keinen Payload ermöglichen und wäre daher nicht praktikabel.
Folgende Header können für Metadaten im Rahmen von REST API Aufrufen genutzt werden
Neben den zuvor erwähnten PVP HTTP Headern für die Token-Chain, können folgende 2 Header geschickt werden, um mögliche Fehleranalysen zu vereinfachen:
Der Response liefert einige nützliche SZR-spezifische HTTP Header:
Das REST OpenAPI File bietet genau 1 Operation welche die PVP Rolle SZR-BPK-Abfrage benötigt.
Das SZR.wsdl listet einige Operationen auf, wovon jedoch meist nur folgende 3 relevant sind:
Das SZR darf eine bPK zu einer Person nur dann ausliefern, wenn diese eindeutig identifiziert wurde.
Zur Identifizierung einer Person müssen Vorname und Familienname, sowie ein 3. Kriterium (siehe Tabelle unten) übermittelt werden.
Aus technischen Gründen wird empfohlen ein möglichst eindeutiges 3. Kriterium zu wählen. Eine gute Wahl ist das Geburtsdatum, eine schlechte Wahl ist das Geschlecht.
Achtung: Sofern vorhanden sollte das Geburtsdatum immer mitgeschickt werden, auch im Falle der Suche mit bPK als Identification.
Folgende Tabelle beschreibt die relevanten Personendaten-Felder in verschiedenen SZR APIs (REST, SOAP, BPK Batch).
Hinter Anschrift kann neben einer ERnP Anschrift auch eine ZMR Meldung stecken.
Die Spalte Information ergänzt relevante Informationen zum Feld im Rahmen des Suchablaufs:
| Beschreibung | Feldname in REST API | Feldname in SOAP API (SZR.wsdl) | BPK Batch Spalte | Information |
|---|---|---|---|---|
| Familienname | familienname | Person.Name.FamilyName | NACHNAME | suchbar, Pflichtfeld für Suche |
| Vorname | vorname | Person.Name.GivenName | VORNAME | suchbar, Pflichtfeld für Suche |
| Name vor Ehe | nameVorEhe | Person.AlternativeName.FamilyName | NAME_VOR_ERSTER_EHE | suchbar |
| Sonstiger Name | Person.AlternativeName.SonstigerName | SONSTIGER_NAME | nur für Insert | |
| Geburtsdatum | geburtsdatum | Person.DateOfBirth | GEBDATUM | suchbar, 3. Suchkriterium (auch wenn teilbefüllt) |
| Geburtsort | geburtsort | Person.PlaceOfBirth | GEBORT | suchbar, 3. Suchkriterium |
| Geburtsstaat | geburtsstaat.isoCode3/name (/ bedeutet und/oder) | Person.CountryOfBirth | GEBSTAAT | suchbar (ISO3 oder Name), 3. Suchkriterium |
| Geschlecht | geschlecht | Person.Sex | GESCHLECHT | suchbar, 3. Suchkriterium |
| Staatsangehörigkeit | geburtsstaat | Person.Nationality | STAATSANGEHÖRIGKEIT | suchbar (ISO3 oder Name), 3. Suchkriterium |
| Anschrift ISO3 Code | anschrift.staat.isoCode3/name | RegularDomicile.StateCode3 | ANSCHRIFTSSTAAT | suchbar |
| Anschrift Gemeinde | anschrift.gemeinde | RegularDomicile.Municipality | GEMEINDENAME | suchbar, 3. Suchkriterium |
| Anschrift Ort(schaft) | anschrift.ort | RegularDomicile.Locality | ORT | suchbar, 3. Suchkriterium |
| Anschrift Postleitzahl | anschrift.postleitzahl | RegularDomicile.PostalCode | PLZ | suchbar, 3. Suchkriterium |
| Anschrift Straße | anschrift.strasse | RegularDomicile.DeliveryAddress.StreetName | STRASSE | suchbar, 3. Suchkriterium |
| Anschrift Hausnummer | anschrift.hausnummer | RegularDomicile.DeliveryAddress.BuildingNumber | HAUSNR | suchbar, 3. Suchkriterium |
| Anschrift Stiege | anschrift.stiege | RegularDomicile.DeliveryAddress.Unit | STIEGE | suchbar, 3. Suchkriterium |
| Anschrift Tür | anschrift.tuer | RegularDomicile.DeliveryAddress.DoorNumber | TÜR | suchbar, 3. Suchkriterium |
| Anschrift Adresszusatz | RegularDomicile.DeliveryAddress.AddressLine | nur für Insert | ||
| Reisedokument Nummer | reisedokument.nummer | TravelDocument.DocumentNumber | DOKUMENTENNR | suchbar, kein Mehrfachtrefferkrit |
| Reisedokument Art | reisedokument.art | TravelDocument.DocumentType | DOKUMENTART | suchbar, kein Mehrfachtrefferkrit |
| Reisedok.Ausstelldatum | reisedokument.ausgestelltVon.datum | TravelDocument.IssueDate | AUSSTELLUNGSDATUM | suchbar, kein Mehrfachtrefferkrit |
| Reisedok.Ausstellbehörde | reisedokument.ausgestelltVon.behoerde | TravelDocument.IssuingAuthority | AUSSTELLUNGSBEHÖRDE | suchbar, kein Mehrfachtrefferkrit |
| Reisedok.Ausstellstaat | reisedokument.ausgestelltVon.staat.isoCode3/name | TravelDocument.IssuingCountry | AUSSTELLUNGSSTAAT | suchbar, kein Mehrfachtrefferkrit |
| ID der Person | id.type+value (beide Pflicht) | Person.Identification.Value+Type (beide Pflicht) | ID_BPK_<BEREICH> | suchbar, 3. Suchkriterium |
Doppelnamen wie „Karl-Heinz“ gelten als ein Vorname. Mehrfachnamen wie „Karl Heinz“ gelten als zwei Vornamen.
Beispiel: Es gibt im ZMR „Hans“ „Hans Peter“, „Hans-Peter“ und „Hans Peter Josef“
Hier die gefundenen Personen, wenn jeweils der linke Wert gesucht wird:
Beim Geburtsdatum besteht die Möglichkeit, nur mit Jahr oder nur mit Jahr und Monat anstelle eines vollständigen Datums zu suchen.
Bei SOAP Requests oder dem BPK Batch kann in dem Fall der Tag bzw. das Monat weggelassen oder mit 00 befüllt werden.
Die REST API hat separate JSON Felder für jahr, monat, tag. Weiß man den Tag bzw Monat nicht, lässt man die Felder einfach weg. Ein Feld mit 0 befüllen ist nicht erlaubt! Bsp: statt 1980-01-00 schickt man folgendes JSON:
"geburtsdatum": {
"jahr": 1980,
"monat": 1
}
Das SZR-Webservice liefert bei privaten Organisationen in keinem Fall Personendaten. Bei behördlichen Nutzern können Personendaten retour kommen, sofern die Suche kein eindeutiges Ergebnis, aber auch nicht mehr als 3 Treffer liefern würde.
Die REST API nutzt die üblichen HTTP Statuscodes (4xx für Client-Fehler, 5xx für Server-Fehler) und teilt sich die SZR spezifischen Fehlercodes mit der SOAP API.
Bsp wenn das JSON im Request invalide ist, wird HTTP Status 400 und SZR F438 returniert:
{
"type": "urn:SZR:F468",
"title": "HTTP payload invalid",
"status": 400,
"errors": [
{
"detail": "Unrecognized field 'vorname', not marked as ignorable at [line: 9, column: 8]",
"pointer": "/suchdaten/0/vorname"
}
]
}
Das JSON Format entspricht Problem JSON (RFC 9457) mit folgenden Regeln:
Das SZR hält sich an die SOAP Spezifikation für die Übertragung von SOAP über HTTP, welche vorsieht, dass jeder erfolgreiche Response den HTTP Statuscode 200 und jeder fehlerhafte Response den HTTP Statuscode 500 hat.
Im Inhalt der Fehlermeldung steht der SZR spezifischen Fehlercode und eine Nachricht die beschreibt, was passiert ist.
Bsp: wenn die Operation GetBPK zu den Personen-Suchdaten niemanden findet, wird HTTP Status 500 und SZR F230 "No person matched" returniert.
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<soap:Fault xmlns:p344="urn:SZRServices">
<faultcode>p344:F230</faultcode>
<faultstring>No person matched</faultstring>
<faultactor>urn:SZRServices</faultactor>
<detail/>
</soap:Fault>
</soap:Body>
</soap:Envelope>
Die XML-Struktur ist für alle Fehler gleich, wobei sich faultcode und faultstring je nach Fehlersituation ändern.
Der Part <faultactor>urn:SZRServices</faultactor> weist darauf hin, dass der Fehler vom SZR erzeugt wurde und nicht z.B. von einem Portalserver am Weg ins SZR.
Zum Vergleich, so würde z.B. ein Portalfehler beim Zugriff auf eine SOAP Schnittstelle aussehen, wenn man das Client-Certificate nicht korrekt konfiguriert hat:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pvp="http://egov.gv.at/pvp1.xsd">
<soapenv:Body>
<soapenv:Fault>
<faultcode>pvp:F401</faultcode>
<faultstring>Unauthorized (401) {0} (STP: )</faultstring>
<faultactor>http://egov.gv.at/pvp1.xsd</faultactor>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
Der Aufbau ist sehr ähnlich, jedoch deutet <faultactor>http://egov.gv.at/pvp1.xsd</faultactor> in dem Fall auf das Portal hin. So ein Request kommt gar nicht bis ins SZR durch.
Achtung: manche Fehlercodes wie F445 gibt es sowohl im SZR als auch im Portal, daher muss unbedingt auf den faultactor geachtet werden! Die häufigisten Portalfehler sind:
Folgende Fehlercodes werden vom SZR genutzt. Steht daneben (pro Person), wird der Fehlercode bei Listenoperationen beim jeweiligen Listenelement eingehängt anstatt den gesamten Response zu einem Fehler zu machen (Bsp dazu siehe weiter unten)
Das Schnittstellenpaket enthält diverse Dateien:
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 SZR eine aktuelle OpenAPI Spezifikation mit HTTP GET auf [Portal-Domain]/at.gv.bmi.sz2-n-[Umgebung]/szr/rest/api/openapi/openapi.json abgerufen werden.
Aus diesem File kann man direkt Client Code generieren, siehe https://swagger.io/tools/swagger-codegen/ oder https://github.com/openapitools/openapi-generator
Eine mögliche Konfiguration um mit maven einen Java Client zu generieren, der Requests via Java11 HTTP Client schickt:
<plugin>
<groupId>org.openapitools</groupId>
<artifactId>openapi-generator-maven-plugin</artifactId>
<version>7.15.0</version> <!-- mit der Version getestet, wenn möglich letzte Version nutzen -->
<executions>
<execution>
<goals><goal>generate</goal></goals>
<phase>generate-sources</phase>
<configuration> <!-- siehe https://github.com/OpenAPITools/openapi-generator/tree/master/modules/openapi-generator-maven-plugin -->
<inputSpecRootDirectory>DIR_MIT_OPENAPI_FILE</inputSpecRootDirectory>
<generatorName>java</generatorName>
<output>${project.basedir}/src/generated/openapi</output>
<configOptions> <!-- ggf können je nach Applikation weitere Settings sinnvoll sein siehe Doku -->
<useTags>true</useTags>
<disallowAdditionalPropertiesIfNotPresent>false</disallowAdditionalPropertiesIfNotPresent> <!-- lt Doku ist false korrekt und true nur aus rückwärtskompat der default -->
<hideGenerationTimestamp>true</hideGenerationTimestamp>
<library>native</library>
<openApiNullable>false</openApiNullable>
<useEnumCaseInsensitive>true</useEnumCaseInsensitive>
</configOptions>
</configuration>
</execution>
</executions>
</plugin>
Achtung: In dem Fall wird Code generiert, der aus dem Response mit new String(byte[]) Strings erzeugt. Wenn im Response Sonderzeichen wie Umlaute enthalten sind funktioniert das nur korrekt sofern das Default Encoding des Systems auf UTF-8 gestellt ist (ist seit Java18 der Default). Vmtl ist das aktuell ein Bug im Codegenerator (korrekt wäre hier beim String immer explizit UTF-8 zu spezifieren).
Im Gegensatz zur Schnittstelle selbst, kann sich die Kombination OpenAPI File + Generatorplugin womöglich öfters rückwärtsinkompatibel ändern. Bsp:
Die SOAP API wird über ein WSDL spezifiziert, welches genutzt werden kann um Teile eines SZR Clients zu generieren.
Zum Beispiel kann für Java die Apache CXF Hilfsmittel wsdl-to-java bzw mit Maven maven-cxf-codegen-plugin-wsdl-to-java nutzen.
Das folgende Beispiel bezieht sich nur auf PVP Header. In echten Requests würde man natürlich auch die in dieser Dokumentation beschriebenen SZR spezifischen Client-Header sowie Accept, Content-Type, ... Header schicken.
Für ein korrektes PVP Chaining müssen diese HTTP Header (=PVP Daten des Ursprungsusers) 1zu1 beim SZR Request mitgeschickt werden (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-userId: c
X-AUTHENTICATE-cn: d
X-AUTHENTICATE-gvOuId: e
X-AUTHENTICATE-ou: f
X-AUTHENTICATE-gvGid: g
X-AUTHENTICATE-mail: h
X-AUTHENTICATE-gvSecClass: 2
X-Version: 1.8
Wenn diese Header im Portal ankommen, werden sie zu PVP-Chain-Headern umgewandelt (erkennbar am X-01- Prefix).
Außerdem ermittelt das Portal anhand des ebenfalls mitzuschickenden Client Zertifikats die PVP Daten und die möglichen Rollen der Clientapplikation (die Werte clientAppParticipantid, ... stehen stellvertretend für die im Portal hinterlegten Daten der Clientapplikation)
Schlussendlich kommen folgende PVP Header im SZR an, womit der Ursprungsuser bekannt ist und korrekt protokolliert (bzw an Folgeregister wie das ZMR weitergeleitet) werden kann.
X-AUTHENTICATE-participantId: clientAppParticipantid
X-AUTHENTICATE-gvOuDomain: clientAppGvOuDomain
X-AUTHENTICATE-userId: clientAppUserId
X-AUTHENTICATE-cn: clientAppCn
X-AUTHENTICATE-gvOuId:clientAppGvOuId
X-AUTHENTICATE-ou: clientAppOu
X-AUTHORIZE-roles: szr-bpk-abfrage
X-AUTHENTICATE-gvSecClass: 2
X-Version: 1.8
X-01-AUTHENTICATE-participantId: a
X-01-AUTHENTICATE-gvOuDomain: b
X-01-AUTHENTICATE-userId: c
X-01-AUTHENTICATE-cn: d
X-01-AUTHENTICATE-gvOuId: e
X-01-AUTHENTICATE-ou: f
X-01-AUTHENTICATE-gvGid: g
X-01-AUTHENTICATE-mail: h
X-01-AUTHENTICATE-gvSecClass: 2
X-01-Version: 1.8
Folgende Abfrage:
URL z.B. für A-Umgebung at.gv.bmi.sz2-n-a/szr/rest/api/bpk/suche
PVP und andere Header werden zwecks Übersicht weggelassen sind aber nötig
{
"suchdaten": [
{
"id": {
"type": "BMI+ZP",
"value": "f4zoq1hBc0TIR/mkTqjQVFja6ao9UAN4HFzeSFiwSNWLMaJQuFQDGLIoq4KLgrs7CH1uHXLDz41KIIt80YrtmQbS38AFanvE49KLjpk/QG6708iKqJEy4iX9BAcoZLL3ShzQe9mhrMC3EwS6oHiFSgmi3TY6drXDJ3yKa23sEPI="
},
"personendaten": {
"familienname": "XXXMuster",
"vorname": "XXXMax xxx",
"geburtsdatum": {
"jahr": 1980,
"monat": 1,
"tag": 1
}
}
}
],
"vkz": "XFN-12345i",
"bereich": [
"XFN+12345i", "XFN-12345i+XFN+12345i"
]
}
Im Response sieht man, dass die angeforderte unverschlüsselte wbPK WqKkLhjamiurkTBTiEEeYzhVQp4= ist und die verschlüsselte wbPK mAouBFZ8uMT3Jdfz76Bb...YMCA==
{
"ergebnis": [
{
"bpks": {
"XFN+12345i": "WqKkLhjamiurkTBTiEEeYzhVQp4=",
"XFN-12345i+XFN+12345i": "mAouBFZ8uMT3Jdfz7Tr6Bb31bbO3ee/qx8L4Bd76eMF59IsrBCP28h0s7IvdBuVL0tVCrs6N3wx7zKEWKeLJyT0I0xX6I96Iryjpni5pOdF/7QDDGzzBTYEKsF/xc/rJV6QZtPQoYHd/tMjbhsBjXWR7N9IfCeck4szl47kkbWPKo0jDsTRZjoPVOFiORmRJtJZiSlZCFg89QtAl/YKraHCXCMuf3vVzR2+LHl9g1+gxGYEhYv9lY/QCO4zeJcWM02dAGkqSr4g0PuDh30ChwMQyEZEJrHrUd4i4gxVesB8pLiwYa1XfHPcPvwotxWKl//8AA8wM8tLer4AMq8YMCA=="
}
}
]
}
Dieses Beispiel zeigt 2 Optionen für behördliche Benutzer (werden via URL Parameter spezifiziert):
Wie man im Beispiel sieht: Wenn die Person eindeutig identifiziert werden kann, bekommt man nur die bPK(s) aber keine Personendaten. Die Geprüft Info steht trotzdem im Response.
Das Beispiel zeigt auch die gleichzeitige Suche nach 2 Personen.
Nachdem es eine Listenabfrage ist, dürfen personenbezogene Fehler nicht den gesamten Response zu einem Fehler machen, daher werden Fehler die mit den jeweiligen Suchdaten zu tun haben im jeweiligen Listenelement als fault returniert.
URL z.B. für A-Umgebung at.gv.bmi.sz2-n-a/szr/rest/api/bpk/suche?ListMultiplePersons=true&AddGeprueftInfo=true
PVP und andere Header werden zwecks Übersicht weggelassen sind aber nötig
{
"suchdaten": [
{
"id": {
"type": "BMI+ZP",
"value": "f4zoq1hBc0TIR/mkTqjQVFja6ao9UAN4HFzeSFiwSNWLMaJQuFQDGLIoq4KLgrs7CH1uHXLDz41KIIt80YrtmQbS38AFanvE49KLjpk/QG6708iKqJEy4iX9BAcoZLL3ShzQe9mhrMC3EwS6oHiFSgmi3TY6drXDJ3yKa23sEPI="
},
"personendaten": {
"familienname": "XXXMuster",
"vorname": "XXXMax xxx",
"geburtsdatum": {
"jahr": 1980,
"monat": 1,
"tag": 1
}
}
}, {
"personendaten": {
"familienname": "GIBTS",
"vorname": "NICHT",
"geburtsdatum": {
"jahr": 1980,
"monat": 1,
"tag": 1
}
}
}
],
"vkz": "BMI",
"bereich": [
"TEST", "BMI+ZP"
]
}
{
"ergebnis": [
{
"bpks": {
"TEST": "MplDSk8IKQ7vYLl6w5RYDDz6F/o=",
"BMI+ZP": "SdovTTl8bxIbAWZxl1QN5E58efS3xNgo7bq6zgFPcslYKgQCmGiHKAiaTBEnLx/Ou3LH0AwFklRLvQGtG4EbJmAXEEpG+QBCwEohiGSX9zjxDLhidjGj8BNeVV+BAK4xh6bu77Nn72TWy2Guw2QNu8eJ9Can80c4746ljgAR/Vw="
}
},
{
"fault": {
"type": "urn:SZR:F230",
"title": "No person matched"
}
}
]
}
Modifiziert man die Suchdaten, sodass mehrere Personen dazu passen, bekommt man als behördlicher Nutzer bis zu 3 Treffer retour. In dem Fall bekommt man jedoch keine bPKs (die gäbe es nur bei eindeutigen Treffern). Mit den Personendaten kann man eine Folgesuche zusammenstellen, die eindeutig wird.
Wären es jedoch mehr als 3 Treffer, würde man den Fault F231 bekommen.
URL z.B. für A-Umgebung at.gv.bmi.sz2-n-a/szr/rest/api/bpk/suche?ListMultiplePersons=true
PVP und andere Header werden zwecks Übersicht weggelassen sind aber nötig
{
"suchdaten": [
{
"personendaten": {
"familienname": "XXXSZR",
"vorname": "XXXTest",
"geburtsdatum": {
"jahr": 1960
}
}
}
],
"vkz": "BMI",
"bereich": [
"TEST"
]
}
{
"ergebnis": [
{
"personen": [
{
"register": "ZMR",
"personendaten": {
"familienname": "XXXSZR",
"vorname": "XXXTest",
"geburtsdatum": {
"jahr": 1960,
"monat": 4,
"tag": 4
},
"geburtsort": "Wien",
"geburtsstaat": {
"isoCode3": "AUT",
"name": "Österreich"
},
"geschlecht": "Männlich"
},
"anschrift": [
{
"staat": {
"isoCode3": "AUT",
"name": "Österreich"
},
"gemeinde": "Testgemeinde 09988",
"strasse": "Testgasse 8 Adamweg",
"ort": "Testort 8 B",
"postleitzahl": "0088",
"hausnummer": "104",
"stiege": "A",
"tuer": "13"
}
],
"staatsangehoerigkeit": [
{
"staat": {
"isoCode3": "AUT",
"name": "Österreich"
}
}
]
},
{
"register": "ZMR",
"personendaten": {
"familienname": "XXXSZR",
"vorname": "XXXTest",
"geburtsdatum": {
"jahr": 1960,
"monat": 2,
"tag": 2
},
"geburtsort": "Wien",
"geburtsstaat": {
"isoCode3": "AUT",
"name": "Österreich"
},
"geschlecht": "Männlich"
},
"anschrift": [
{
"staat": {
"isoCode3": "AUT",
"name": "Österreich"
},
"gemeinde": "Testgemeinde 09988",
"strasse": "Testgasse 8 Adamweg",
"ort": "Testort 8 A",
"postleitzahl": "0088",
"hausnummer": "Gruppe",
"stiege": "117",
"tuer": "4"
}
],
"staatsangehoerigkeit": [
{
"staat": {
"isoCode3": "AUT",
"name": "Österreich"
}
}
]
},
{
"register": "ZMR",
"personendaten": {
"familienname": "XXXSZR",
"vorname": "XXXTest",
"geburtsdatum": {
"jahr": 1960,
"monat": 2,
"tag": 2
},
"geburtsort": "Wien",
"geburtsstaat": {
"isoCode3": "AUT",
"name": "Österreich"
},
"geschlecht": "Männlich"
},
"anschrift": [
{
"staat": {
"isoCode3": "AUT",
"name": "Österreich"
},
"gemeinde": "Testgemeinde 09988",
"strasse": "Teststraße 8 Bertaweg",
"ort": "Testort 8 A",
"postleitzahl": "0088",
"hausnummer": "Ladenzeile"
}
],
"staatsangehoerigkeit": [
{
"staat": {
"isoCode3": "AUT",
"name": "Österreich"
}
}
]
}
]
}
]
}
In diesem Bsp wären die PVP Daten des Ursprungsusers folgende (natürlich sind die Werte a, b, c, ... nur simple Ersatzwerte für echte PVP Daten eines Users):
<pvpToken version="1.9">
<authenticate>
<participantId>a</participantId>
<gvOuDomain>b</gvOuDomain>
<userPrincipal>
<userId>c</userId>
<cn>d</cn>
<gvOuId>e</gvOuId>
<ou>f</ou>
<gvSecClass>2</gvSecClass>
<gvGid>g</gvGid>
</userPrincipal>
</authenticate>
</pvpToken>
Der Block muss korrekterweise im SOAP Header des SZR Requests stehen, damit das SZR bzw ERNP/ZMR korrekt protokollieren können, an wen die bPK schlussendlich übermittelt wird:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>
<ns4:Security xmlns="http://egov.gv.at/pvp1.xsd" xmlns:ns4="http://schemas.xmlsoap.org/ws/2002/04/secext">
<pvpToken version="1.9">
<authenticate>
<participantId>a</participantId>
<gvOuDomain>b</gvOuDomain>
<userPrincipal>
<userId>c</userId>
<cn>d</cn>
<gvOuId>e</gvOuId>
<ou>f</ou>
<gvSecClass>2</gvSecClass>
<gvGid>g</gvGid>
</userPrincipal>
</authenticate>
</pvpToken>
</ns4:Security>
</S:Header>
<S:Body>
<ns3:GetBPK xmlns:ns2="http://reference.e-government.gv.at/namespace/persondata/20020228#" xmlns:ns3="urn:SZRServices">
<ns3:PersonInfo>
<ns3:Person>
<ns2:Name>
<ns2:GivenName>test</ns2:GivenName>
<ns2:FamilyName>test</ns2:FamilyName>
</ns2:Name>
<ns2:DateOfBirth>1990-01-01</ns2:DateOfBirth>
</ns3:Person>
</ns3:PersonInfo>
<ns3:BereichsKennung>urn:publicid:gv.at:cdid+TEST</ns3:BereichsKennung>
<ns3:VKZ>BMI</ns3:VKZ>
</ns3:GetBPK>
</S:Body>
</S:Envelope>
Der Request geht über das Portal ins SZR und würde z.B. folgendermaßen im SZR ankommen.
Statt clientAppParticipantid würde die im Portal hinterlegte ParticipantId der Clientapplikation die auf das SZR zugreift stehen (genauso auch userId, ...)
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>
<ns4:Security xmlns:ns4="http://schemas.xmlsoap.org/ws/2002/04/secext">
<pvpToken xmlns="http://egov.gv.at/pvp1.xsd" version="1.9">
<authenticate>
<participantId>clientAppParticipantid</participantId>
<gvOuDomain>clientAppGvOuDomain</gvOuDomain>
<systemPrincipal>
<userId>clientAppUserId</userId>
<cn>clientAppCn</cn>
<gvOuId>clientAppGvOuId</gvOuId>
<ou>clientAppOu</ou>
</systemPrincipal>
</authenticate>
<authorize>
<role value="szr-bpk-abfrage"/>
</authorize>
<pvpChainedToken version="1.9">
<authenticate>
<participantId>a</participantId>
<gvOuDomain>b</gvOuDomain>
<userPrincipal>
<userId>c</userId>
<cn>d</cn>
<gvOuId>e</gvOuId>
<ou>f</ou>
<gvSecClass>2</gvSecClass>
<gvGid>g</gvGid>
</userPrincipal>
</authenticate>
</pvpChainedToken>
</pvpToken>
</ns4:Security>
</S:Header>
<S:Body>
<ns3:GetBPK xmlns:ns3="urn:SZRServices" xmlns:ns2="http://reference.e-government.gv.at/namespace/persondata/20020228#">
<ns3:PersonInfo>
<ns3:Person>
<ns2:Name>
<ns2:GivenName>test</ns2:GivenName>
<ns2:FamilyName>test</ns2:FamilyName>
</ns2:Name>
<ns2:DateOfBirth>1990-01-01</ns2:DateOfBirth>
</ns3:Person>
</ns3:PersonInfo>
<ns3:BereichsKennung>urn:publicid:gv.at:cdid+TEST</ns3:BereichsKennung>
<ns3:VKZ>BMI</ns3:VKZ>
</ns3:GetBPK>
</S:Body>
</S:Envelope>
Folgende Abfrage:
<Target> Elements, was bedeutet, dass die Kombination als verschlüsselte bPK abgefragt wird. Wie man sieht, wird im Request nicht der String urn:publicid:gv.at:ewbpk+XFN-12345i+XFN+12345i genutzt. Dieses Format befindet sich nur im zugehörigen Responseabschnitt.Zwecks Übersicht wird hier in den Beispielen der SOAP Header inkl PVP Chain etc entfernt
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>... </S:Header>
<S:Body>
<GetBPK xmlns="urn:SZRServices" xmlns:ns2="http://reference.e-government.gv.at/namespace/persondata/20020228#">
<PersonInfo>
<Person>
<ns2:Identification>
<ns2:Value>f4zoq1hBc0TIR/mkTqjQVFja6ao9UAN4HFzeSFiwSNWLMaJQuFQDGLIoq4KLgrs7CH1uHXLDz41KIIt80YrtmQbS38AFanvE49KLjpk/QG6708iKqJEy4iX9BAcoZLL3ShzQe9mhrMC3EwS6oHiFSgmi3TY6drXDJ3yKa23sEPI=</ns2:Value>
<ns2:Type>urn:publicid:gv.at:ecdid+BMI+ZP</ns2:Type>
</ns2:Identification>
<ns2:Name>
<ns2:GivenName>XXXMax xxx</ns2:GivenName>
<ns2:FamilyName>XXXMuster</ns2:FamilyName>
</ns2:Name>
<ns2:DateOfBirth>1980-01-01</ns2:DateOfBirth>
</Person>
</PersonInfo>
<BereichsKennung>urn:publicid:gv.at:wbpk+XFN+12345i</BereichsKennung>
<VKZ>XFN-12345i</VKZ>
<Target>
<BereichsKennung>urn:publicid:gv.at:wbpk+XFN+12345i</BereichsKennung>
<VKZ>XFN-12345i</VKZ>
</Target>
</GetBPK>
</S:Body>
</S:Envelope>
Im Response sieht man, dass die angeforderte unverschlüsselte wbPK WqKkLhjamiurkTBTiEEeYzhVQp4= ist und die verschlüsselte wbPK nJBWSRKHL7Ga1YXca1g...k3akog==
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://reference.e-government.gv.at/namespace/persondata/20020228#" xmlns:ns2="urn:SZRServices">
<soapenv:Body>
<ns2:GetBPKResponse xmlns:ns3="http://egov.gv.at/pvp1.xsd" xmlns:ns4="http://schemas.xmlsoap.org/ws/2002/04/secext">
<ns2:GetBPKReturn>WqKkLhjamiurkTBTiEEeYzhVQp4=</ns2:GetBPKReturn>
<ns2:FremdBPK>
<ns2:BereichsKennung>urn:publicid:gv.at:ewbpk+XFN-12345i+XFN+12345i</ns2:BereichsKennung>
<ns2:FremdBPK>nJBWSRKHL7Ga1YXca1gxyG0zzaAsIaulVx0YSuckVXAh5x7BXU9U9stYi4LfAotBQH8dGmWkExpuJVB36SkrFW7aAk6rgZHlvZ53DMgyfWlVxGs7wg6xQpcONKbw0l/sfHMqcZUNFtnaDD8jZnJeX7nc+y/CxB1VreHx6tdpJvo2aXi1f8Jg+d1NXWpss3/NGzzM7dHjte/jfNyBoSRg5tmkVueU335al8xjYCk90JVA/U58PFz6O0CQVwz6tmNW6pqQaGpdh1Ir5O3vztbLvZtqjpmOEp0ESyH2xDOBCIBWfTTuku/P1EkQXwIZbkMpxMbOPyXrVSWWP1fLk3akog==</ns2:FremdBPK>
</ns2:FremdBPK>
</ns2:GetBPKResponse>
</soapenv:Body>
</soapenv:Envelope>
Dieses Beispiel zeigt 2 Optionen für behördliche Benutzer:
<ListMultiplePersons>true</ListMultiplePersons> kann von behördlichen Nutzern gesetzt werden, damit Personendaten von bis zu 3 zu den Suchdaten passenden Personen returniert werden (es werden dafür keine bPK(s) geliefert. Stattdessen muss man spezifizieren welche Person man davon genau meint und einen erneuten Request absenden der dann hoffentlich eindeutig ist)<AddGeprueftInfo>true</AddGeprueftInfo> kann von behördlichen Nutzern gesetzt werden, damit neben der bPK im Ergebnis auch steht, ob die jeweilige Person geprüft ist oder nicht. Geprüft bedeutet die Datenqualität ist höher und die Person ist EID-tauglich. ZMR Personen sind immer geprüft, außer deren Identität ist nicht gesichertWie oben erwähnt ist folgender Request nur für behördliche Organisationen relevant. Private bekommen nie Personendaten und können die Option <ListMultiplePersons> gar nicht nutzen.
Zwecks Übersicht wird hier in den Beispielen der SOAP Header inkl PVP Chain etc entfernt
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>...</S:Header>
<S:Body>
<GetBPK xmlns="urn:SZRServices" xmlns:ns2="http://reference.e-government.gv.at/namespace/persondata/20020228#">
<PersonInfo>
<Person>
<ns2:Name>
<ns2:GivenName>XXXMax xxx</ns2:GivenName>
<ns2:FamilyName>XXXMuster</ns2:FamilyName>
</ns2:Name>
<ns2:DateOfBirth>1980-01-01</ns2:DateOfBirth>
</Person>
</PersonInfo>
<BereichsKennung>urn:publicid:gv.at:cdid+TEST</BereichsKennung>
<VKZ>BMI</VKZ>
<Target>
<BereichsKennung>urn:publicid:gv.at:cdid+ZP</BereichsKennung>
<VKZ>BMI</VKZ>
</Target>
<Target>
<BereichsKennung>urn:publicid:gv.at:cdid+T1</BereichsKennung>
<VKZ>BMI</VKZ>
</Target>
<ListMultiplePersons>true</ListMultiplePersons>
<AddGeprueftInfo>true</AddGeprueftInfo>
</GetBPK>
</S:Body>
</S:Envelope>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://reference.e-government.gv.at/namespace/persondata/20020228#" xmlns:ns2="urn:SZRServices">
<soapenv:Body>
<ns3:GetBPKResponse xmlns:ns0="http://reference.e-government.gv.at/namespace/persondata/20020228#" xmlns:ns3="urn:SZRServices">
<ns3:GetBPKReturn>MplDSk8IKQ7vYLl6w5RYDDz6F/o=</ns3:GetBPKReturn>
<ns3:FremdBPK>
<ns3:BereichsKennung>urn:publicid:gv.at:ecdid+BMI+ZP</ns3:BereichsKennung>
<ns3:FremdBPK>FrdnVY17rBIRZ31UnCPZkQW0nONvfWeuM8roAU1m3s69SU/sCorabEI/49UePFen8XHN7NlAh4jdj7hBw2t+IvWU+mKO6qePyRVpEkUDk6pK9Bz/vNIuQxr+XgUQ7+dJPs+zCBnifF+TbTwGCs4nZsOHU2HfeLDH97tHCxZ6I3A=</ns3:FremdBPK>
</ns3:FremdBPK>
<ns3:FremdBPK>
<ns3:BereichsKennung>urn:publicid:gv.at:ecdid+BMI+T1</ns3:BereichsKennung>
<ns3:FremdBPK>fkV2HNm7ROS1iWh+tr1ByG1avtvOjC5c/GngnbyDTQdNn8KjzE0vX/geyAaYV5xLnOeX/Ci7tzqYHMrzqAYhgeuHgRAb699srWFOXzmk4mp3c2UmWLxolrItQ1ukMu4ITujJapUyyFGvG/sncZZ6i96sUNKQ/fOwApJC9N1oA/QHdekEnZkPiK3Pkhw+lrLA2bvVXwWEbwusdLfI8Dm2mgh8WTCL5e023g7EQt7PliKvLwY5eJaQDRcnXhA3OL3dZeR8fAeQ/i144EfjXdgfOMEDePksXft3xkYH9I2ndSa4NWw2glOyg71lf+2PLKxpqLnEARohRr9iUvYs3vHd5w==</ns3:FremdBPK>
</ns3:FremdBPK>
<ns3:Geprueft>true</ns3:Geprueft>
</ns3:GetBPKResponse>
</soapenv:Body>
</soapenv:Envelope>
Modifiziert man die Suchdaten, sodass mehrere Personen dazu passen, bekommt man als behördlicher Nutzer bis zu 3 Treffer retour. In dem Fall bekommt man jedoch keine bPKs (die gäbe es nur bei eindeutigen Treffern). Mit den Personendaten kann man eine Folgesuche zusammenstellen, die eindeutig wird.
Wären es jedoch mehr als 3 Treffer, würde man den SOAP Fault F231 bekommen.
Zwecks Übersicht wird hier in den Beispielen der SOAP Header inkl PVP Chain etc entfernt
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>...</S:Header>
<S:Body>
<GetBPK xmlns="urn:SZRServices" xmlns:ns2="http://reference.e-government.gv.at/namespace/persondata/20020228#">
<PersonInfo>
<Person>
<ns2:Name>
<ns2:GivenName>XXXTest</ns2:GivenName>
<ns2:FamilyName>XXXSZR</ns2:FamilyName>
</ns2:Name>
<ns2:DateOfBirth>1960</ns2:DateOfBirth>
</Person>
</PersonInfo>
<BereichsKennung>urn:publicid:gv.at:cdid+TEST</BereichsKennung>
<VKZ>BMI</VKZ>
<ListMultiplePersons>true</ListMultiplePersons>
</GetBPK>
</S:Body>
</S:Envelope>
<soapenv:Envelope xmlns="http://reference.e-government.gv.at/namespace/persondata/20020228#" xmlns:ns2="urn:SZRServices" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ns3:GetBPKResponse xmlns:ns0="http://reference.e-government.gv.at/namespace/persondata/20020228#" xmlns:ns3="urn:SZRServices">
<ns3:PersonInfo>
<ns3:Person>
<ns0:Name>
<ns0:GivenName>XXXTest</ns0:GivenName>
<ns0:FamilyName>XXXSZR</ns0:FamilyName>
</ns0:Name>
<ns0:Sex>male</ns0:Sex>
<ns0:DateOfBirth>1960-04-04</ns0:DateOfBirth>
<ns0:PlaceOfBirth>Wien</ns0:PlaceOfBirth>
<ns0:CountryOfBirth>Österreich</ns0:CountryOfBirth>
<ns0:Nationality>Österreich</ns0:Nationality>
</ns3:Person>
<ns3:RegularDomicile>
<ns0:PostalCode>0088</ns0:PostalCode>
<ns0:Municipality>Testgemeinde 09988</ns0:Municipality>
<ns0:Locality>Testort 8 B</ns0:Locality>
<ns0:StateCode3>AUT</ns0:StateCode3>
<ns0:DeliveryAddress>
<ns0:StreetName>Testgasse 8 Adamweg</ns0:StreetName>
<ns0:BuildingNumber>104</ns0:BuildingNumber>
<ns0:Unit>A</ns0:Unit>
<ns0:DoorNumber>13</ns0:DoorNumber>
</ns0:DeliveryAddress>
</ns3:RegularDomicile>
</ns3:PersonInfo>
<ns3:PersonInfo>
<ns3:Person>
<ns0:Name>
<ns0:GivenName>XXXTest</ns0:GivenName>
<ns0:FamilyName>XXXSZR</ns0:FamilyName>
</ns0:Name>
<ns0:Sex>male</ns0:Sex>
<ns0:DateOfBirth>1960-02-02</ns0:DateOfBirth>
<ns0:PlaceOfBirth>Wien</ns0:PlaceOfBirth>
<ns0:CountryOfBirth>Österreich</ns0:CountryOfBirth>
<ns0:Nationality>Österreich</ns0:Nationality>
</ns3:Person>
<ns3:RegularDomicile>
<ns0:PostalCode>0088</ns0:PostalCode>
<ns0:Municipality>Testgemeinde 09988</ns0:Municipality>
<ns0:Locality>Testort 8 A</ns0:Locality>
<ns0:StateCode3>AUT</ns0:StateCode3>
<ns0:DeliveryAddress>
<ns0:StreetName>Testgasse 8 Adamweg</ns0:StreetName>
<ns0:BuildingNumber>Gruppe</ns0:BuildingNumber>
<ns0:Unit>117</ns0:Unit>
<ns0:DoorNumber>4</ns0:DoorNumber>
</ns0:DeliveryAddress>
</ns3:RegularDomicile>
</ns3:PersonInfo>
<ns3:PersonInfo>
<ns3:Person>
<ns0:Name>
<ns0:GivenName>XXXTest</ns0:GivenName>
<ns0:FamilyName>XXXSZR</ns0:FamilyName>
</ns0:Name>
<ns0:Sex>male</ns0:Sex>
<ns0:DateOfBirth>1960-02-02</ns0:DateOfBirth>
<ns0:PlaceOfBirth>Wien</ns0:PlaceOfBirth>
<ns0:CountryOfBirth>Österreich</ns0:CountryOfBirth>
<ns0:Nationality>Österreich</ns0:Nationality>
</ns3:Person>
<ns3:RegularDomicile>
<ns0:PostalCode>0088</ns0:PostalCode>
<ns0:Municipality>Testgemeinde 09988</ns0:Municipality>
<ns0:Locality>Testort 8 A</ns0:Locality>
<ns0:StateCode3>AUT</ns0:StateCode3>
<ns0:DeliveryAddress>
<ns0:StreetName>Teststraße 8 Bertaweg</ns0:StreetName>
<ns0:BuildingNumber>Ladenzeile</ns0:BuildingNumber>
</ns0:DeliveryAddress>
</ns3:RegularDomicile>
</ns3:PersonInfo>
</ns3:GetBPKResponse>
</soapenv:Body>
</soapenv:Envelope>
<InsertERnP>true</InsertERnP> womit nicht gefundene Personen automatisch im ERNP eingetragen werden. Diese Option muss explizit von der Stammzahlregisterbehörde freigegeben werden, damit man sie nutzen kann.Hierbei handelt es sich grundsätzlich um dieselbe Abfrage wie getBpk ohne die Optionen <ListMultiplePersons> und <InsertErnp>, jedoch ist die Operation listenbasiert und somit für die Abfrage mehrerer Personen viel performanter als einzelne GetBPK Abfragen.
Nachdem es eine Listenabfrage ist, dürfen personenbezogene Fehler nicht den gesamten Response zu einem SOAP Fault machen, daher werden Fehler die mit den jeweiligen Suchdaten zu tun haben im Response unter GetBPKsResponseType.Fault hinterlegt.
Im folgenden Beispiel sieht man eine Abfrage nach 2 Personen, wobei die 1. gefunden wird und die 2. den Fehler No person matched bekommt (wie zuvor erwähnt macht das nicht den gesamten Response zu einem Fehler, sondern nur das jeweilige zur Person passende Listenelement)
Zwecks Übersicht wird hier in den Beispielen der SOAP Header inkl PVP Chain etc entfernt
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>...</S:Header>
<S:Body>
<GetBPKs xmlns="urn:SZRServices" xmlns:ns2="http://reference.e-government.gv.at/namespace/persondata/20020228#">
<PersonInfo>
<Person>
<ns2:Name>
<ns2:GivenName>XXXMax</ns2:GivenName>
<ns2:FamilyName>XXXMuster</ns2:FamilyName>
</ns2:Name>
<ns2:DateOfBirth>1980-01-01</ns2:DateOfBirth>
</Person>
</PersonInfo>
<PersonInfo>
<Person>
<ns2:Name>
<ns2:GivenName>GIBTS</ns2:GivenName>
<ns2:FamilyName>NICHT</ns2:FamilyName>
</ns2:Name>
<ns2:DateOfBirth>1980-01-01</ns2:DateOfBirth>
</Person>
</PersonInfo>
<VKZ>BMI</VKZ>
<Target>
<BereichsKennung>urn:publicid:gv.at:cdid+T1</BereichsKennung>
<VKZ>BMI</VKZ>
</Target>
</GetBPKs>
</S:Body>
</S:Envelope>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://reference.e-government.gv.at/namespace/persondata/20020228#" xmlns:ns2="urn:SZRServices">
<soapenv:Body>
<ns2:GetBPKsResponse xmlns:ns3="http://egov.gv.at/pvp1.xsd" xmlns:ns4="http://schemas.xmlsoap.org/ws/2002/04/secext">
<ns2:ResultRecord>
<ns2:FremdBPK>
<ns2:BereichsKennung>urn:publicid:gv.at:ecdid+BMI+T1</ns2:BereichsKennung>
<ns2:FremdBPK>DrrL/jv3m15AcG96V1tuDe2mmfdfzdG3N5FuImKCjoerCid+lxk02ANf2WNEdwHmBNk+iCJWmwEnpzNa7E+qxJ9P/RBax06nXPdV/BVstSgyfEkS/TiTOQkotcW0COonngi7arZjo38Ia026odpebvbOKmUs4hHnBYweXyaLu31EODsRK9cKpqlWV3wtG3ZGVMyNJrgMUNvEdjit9uOHQlYQfulFwtiT2/2HwnxXq25GkfW2EDI8jwVKQxAxBQXzdhQqOkhTpRhrsmrq6rLPffJmwe2ArUQFUU6rmX0Ku/AnGZhebjYtMLZ7/zB3DVs9oZeoFtC+8h7bDxmW2L8Npw==</ns2:FremdBPK>
</ns2:FremdBPK>
</ns2:ResultRecord>
<ns2:ResultRecord>
<ns2:Fault Code="F230" String="No person matched"/>
</ns2:ResultRecord>
</ns2:GetBPKsResponse>
</soapenv:Body>
</soapenv:Envelope>
Die Operation liefert allgemeine Informationen zum SZR Service, wie die Umgebung, die aktuelle Version und die Zeit wann diese Version eingesetzt wurde.
Zwecks Übersicht wird hier in den Beispielen der SOAP Header inkl PVP Chain etc entfernt
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>...</S:Header>
<S:Body>
<GetVersion xmlns="urn:SZRServices"/>
</S:Body>
</S:Envelope>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://reference.e-government.gv.at/namespace/persondata/20020228#" xmlns:ns2="urn:SZRServices">
<soapenv:Body>
<ns2:GetVersionResponse xmlns:ns3="http://egov.gv.at/pvp1.xsd" xmlns:ns4="http://schemas.xmlsoap.org/ws/2002/04/secext">
<ns2:Version>2.2.0.0</ns2:Version>
<ns2:Time>2024-01-15 09:40:10</ns2:Time>
<ns2:Umgebung>P</ns2:Umgebung>
</ns2:GetVersionResponse>
</soapenv:Body>
</soapenv:Envelope>