Die advoware API nutzt eine Token-Authentifizierung.
Wir gehen hier auf die einzelnen Schritte ein, wie die Token-Authentifizierung zu nutzen ist.
Daten
Für die Nutzung der Token-Authentifizierung benötigt man folgende Daten:
App-ID
API-Key
Product = 64
Das Product ist für Drittanbieter immer die 64.
Schritt 1: URL-Abfrufen
Die URL zur Token-Authentifizierung wird über einen vorherigen GET-Aufruf abgefragt, dieser sieht wie folgt aus.
https://www2.advo-net.net/AdvonetConfigurator/api/Url?Kanzlei=KANZLEIKENNUNG-HIER-EINTRAGEN
Man erhält eine JSON-Struktur zurück die in etwa so aussieht:
{"relayUrl":"https://www2.advo-net.net:90/","connectorUrl":null,"securityGateway":"https://security.advo-net.net/"}
Der Wert “securityGateway” ist der entscheidende, da er die Basis-URL für die Anfrage zur Authentifizierung bereitstellt.
Schritt 2: URL zusammenbauen
Die Basis-URL aus Schritt 1 wird um folgenden Pfad ergänzt:
Basis-URL + /api/v1/Token
Am konkreten Beispiel sieht die endgültige URL wie folgt aus:
https://security.advo-net.net/api/v1/Token
Schritt 3: JSON-Struktur an das Security Gateway senden
Das Security Gateway nimmt die Anfragen entgegen und entscheidet ob Zugriff gewährt werden kann oder nicht. Dazu muss man eine JSON-Struktur via POST-Aufruf an die aus Schritt 2 zusammengesetzte URL schicken. Hierfür werden unter anderem die Daten wie App-ID, API-Key und Product benötigt. Zusätzlich werden weitere Werte benötigt, die nach dem Beispiel erläutert werden:
{ "AppID": "APPID", "Kanzlei": "KANZLEIKENNUNG", "Database": "DATENBANK", "User": "MITARBEITERKUERZEL", "Role": 2, "Product": 64, "Password": "????????", "Nonce": "76f895f8-3d7b-447b-825b-7b1ff67dc637", "HMAC512Signature": "uzp2lp0K4AbiSQH5hTErvyF1yiGO20Y6reWjLgA10RK9ExNfrCZWMQxfK8x+c/Q+egF6ArTkt95zXgdSbl6Jvg==", "RequestTimeStamp": "2021-01-29T14:04:26.7955547Z" }
Neben der bereits erwähnten App-ID muss man folgende Daten angeben:
Kanzlei | Die Kanzleikennung die bereits für die Einrichtung des advoware Manager benötigt wird oder auch zuvor schon vom Freigabedienst verwendet wurde. Wenn diese nicht vorhanden ist kann man sich registrieren, z.B. aus advoware heraus. |
---|---|
Database | Die Datenbank beim Kunden auf die man zugreifen möchte. Bei einer Standard-Installation wäre dies “ADVOWARE”. |
User | Kürzel des Mitarbeiters oder des API-Nutzers. |
Role | 2 |
Product | 64 |
Password | Das hier genutzte Password wird in der advoware Kanzleisoftware in den Einstellungen des Benutzers hinterlegt. Dabei handelt es sich um das “Passwort advoware online Dienste”, nicht zu verwechseln mit dem “Passwort”, welches rein für die Anmeldung in der advoware Kanzleisoftware vorgesehen ist. |
Nonce | Zufällig generierter Wert, welcher sich aber für die HMAC-Signierung gemerkt werden muss. Wir nutzen z.B. die GUID. |
HMAC512Signature | HMAC512-Signierung der Daten → wird weiter unten erläutert |
RequestTimeStamp | Zeitstempel im ISO-8601 Format. Auch dieser Zeitstempel wird für die HMAC512-Signierung noch einmal benötigt und muss sich gemerkt werden. |
Bei den Daten die man übertragen kann ist die Groß-/Kleinschreibung immer essenziell wichtig! Ebenso Leerzeichen!
Generierung der HMAC512-Signatur
Das hier aufgeführte Beispiel ist C#/.NET-Code und muss ggf. an die Programmiersprache angepasst bzw. übertragen werden.
public static string GenerateHMAC(int productId, string appId, string apiKey, string requestTimeStamp, string nonce = "") { if (String.IsNullOrEmpty(nonce)) nonce = System.Guid.NewGuid().ToString(); byte[] dataToSign = Encoding.UTF8.GetBytes($"{productId}:{appId}:{nonce}:{requestTimeStamp}"); //string to encode e.g.: "64:APPID:76f895f8-3d7b-447b-825b-7b1ff67dc637:2021-01-29T14:04:26.7955547Z" byte[] apiKeyBytes = Convert.FromBase64String(apiKey); using (HMACSHA512 hmac = new HMACSHA512(apiKeyBytes)) { using (MemoryStream streamToSign = new MemoryStream(dataToSign)) { byte[] signatureBytes = hmac.ComputeHash(streamToSign); return Convert.ToBase64String(signatureBytes); } } }
Man erhält folgende beispielhafte JSON-Struktur vom Security Gateway als Antwort, sofern die Authentifizierung geklappt hat:
{ "token_type": "Bearer", "expires_in": 3600, "expiration_utc": "2021-09-16T14:43:49.2078217Z", "access_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjAzOTAwRjIyMkI1NkNBMkIyQzJFMDI1MTQ0QkJCRkUxMTBGREZBQkMiLCJ4NXQiOiJBNUFQSWl0V3lpc3NMZ0pSUkx1XzRSRDktcnciLCJ0eXAiOiJKV1QifQ.eyJzdWIiOiJNUiIsImp0aSI6ImUyZjNlYjViLTVkMWEtNDNlNS1hNmVhLWJjYWJmNmQzNjBmNCIsIkthbnpsZWkiOiJtcnRlc3QiLCJEYXRhYmFzZSI6Ik1BVFQiLCJBcHBJRCI6IkFkdm93YXJlTW9iaWxlX1VXUF8xLjY0IiwiUHJvZHVjdCI6IkFXTW9iaWxlIiwibmJmIjoxNjMxNzk5ODI5LCJleHAiOjE2MzE4MDM0MjksImlhdCI6MTYzMTc5OTgyOSwiaXNzIjoiYWR2b25ldFNlY3VyaXR5R2F0ZXdheSIsImF1ZCI6ImFkdm9uZXRVc2VyIn0.D68f6yBqEQeMRhAJ1-w_4YnAu512SK-c2FIt-pUFBGEi8nCK_nf2dO0sk81F5TOR0y62Hd9ffu5O0V7v3MSK0zPjRp05v6wyrtgyiffcu9Kz3-3Vuu8lVzzA4ojT90D60neFMtwGpFcgC4SJl6c6SljiTmmOe1HadI1xlHFm_O4iWCUDMyb-Hz3XxcP8vs-jrh7DUzVsGLYkQn0pMThZSkqwtI-sbgR5ZT2beNWVeYI0Fmj76XXm5cPJe77VxZ81L7mADm8V3_KsTc5Jox_qZewQd3NLyFo5waLwvQFC0tqN63ZCjNQpQfqC-79O2TggDVg1vuefcLcD2_wBrlwgtcDKDAaA83zZBDZYEKXrKcBpJL825ZjKEyW50O8b5dP0CwTdKegv_FQcYrO06lHsTDpYwxfQNITu_Hy3RoZOmljvFKkXT-8F59FEJ-xp1R1sbYOswcEhPGKknpFpZoW4Vy9tPXULmeLMEyHKQ4GGlmvWkXrtBAcmYZn_EeLhdhRlP-yZPfP5oaxdJrQ9qrhBcfgEmOjX0Nz-YzFvR3Qthlu9yrCdnpMbSeTaEqVUJXLVIHQ3sLgCRAPYrDaLuPUXMWLSv_UnukRUv0x9IWophvbyiGSU1t_lo9KYhvTqCiZB8n8e-DQjlT8fQye46OaSrueVfPJ7op5nZkuVAZB8d38", "refresh_token": null }
Hier noch ein Beispiel für die Generierung der HMAC512-Signatur in PHP:
<?php class IdentityHMAC { public $AppID; public $Kanzlei; public $Database; public $User; public $Role; public $Product; public $Password; public $Nonce; public $HMAC512Signature; public $RequestTimeStamp; public function Sign(string $apiKey) : string { // Fills $RequestTimeStamp and then HMAC512Signature with the signature and returns a json serialized string of the whole object $objDateTime = new DateTime('NOW'); $objDateTime = $objDateTime->setTimezone(new DateTimeZone("UTC")); $this->RequestTimeStamp = $objDateTime->format(DateTime::ISO8601); $this->Nonce = uniqid(); $dataToSign = sprintf("%s:%s:%s:%s", $this->Product, $this->AppID, $this->Nonce, $this->RequestTimeStamp); $this->HMAC512Signature = base64_encode(hash_hmac('sha512', utf8_encode($dataToSign), base64_decode($apiKey), true)); return json_encode($this); } } $i = new IdentityHMAC(); $i->AppID = "Your AppID"; $i->Kanzlei = "test"; $i->Database = "DATABASE"; $i->User = "TEST"; $i->Password = "!!Secret!!"; $i->Role = 2; $i->Product = 64; echo $i->Sign('Your secret API Key');
Schritt 4: Statt Basic Authentication Header nun „Bearer“ Header setzen
Jede Anfrage, die bisher an den Connector ging (über das Relay) hatte den Basic Authentication Header gesetzt. Zukünftig muss hier der „Bearer“-Header gesetzt werden, dieser muss dann das Token, aus dem aus Schritt 3 zurückbekommenen JSON enthalten („access_token“).
Schritt 5: API-Endpunkte aufrufen
GET https://www2.advo-net.net:90/api/v1/Akten