Signatur

Funktionsweise

Um den Konsumenten gegenüber der API zu authentifizieren, muss jeder API-Request mit einem Hash signiert werden.

Der Hash wird wie die Signatur für Webhooks mit Hilfe des secret generiert.

Generierung

Folgende Werte des API-Requests werden zu einem String zusammengesetzt. Alle Werte sind durch einen . voneinander zu trennen.

Wert Beispiel
target 48:88:1F:C9:B0:BA
consumer 8d8d52b6-ab21-4984-8abc-c5640b2e107e
data (als JSON) {"event":"Normalruf","position":"Haupteingang","closed":"false"}
{
    "target": "48:88:1F:C9:B0:BA",
    "consumer": "8d8d52b6-ab21-4984-8abc-c5640b2e107e",
    "data": {
        "event": "Normalruf",
        "position": "Haupteingang",
        "closed": false
    }
}

Aus dem obenstehenden Webhook ergibt sich also folgender Prüfstring:

48:88:1F:C9:B0:BA.8d8d52b6-ab21-4984-8abc-c5640b2e107e.{"event":"Normalruf","position":"Haupteingang","closed":false}

Aus diesem String wird nun ein Hash mit Schlüssel unter Verwendung von HMAC berechnet. Der verwendete Hash-Algorithmus ist sha256. Als Schlüssel wird das hinterlegte Hash-Secret verwendet.

Hinweis zum JSON-Format

Es gelten die gleichen Formatierungsregeln wie bei den Webhooks. Siehe Webhooks → Signatur → Hinweis zum JSON-Format.

Beispielimplementierung in PHP

$hashString = implode('.', [
    $request->target,
    $request->consumer,
    json_encode($request->data, JSON_UNESCAPED_UNICODE)
]);
// 48:88:1F:C9:B0:BA.8d8d52b6-ab21-4984-8abc-c5640b2e107e.{"event":"Normalruf","position":"Haupteingang","closed":false}

$hash = hash_hmac('sha256', $hashString, 'secret');
// 5ef777799388eb3a38a6c52d055232fa30ba5174ad32d6dcbacbb5aaf9e18ae2

$request->hash = $hash;

Beispielimplementierung in JavaScript

// https://github.com/brix/crypto-js
import * as CryptoJS from 'crypto-js';

const hashString = [
    request.target,
    request.consumer,
    JSON.stringify(request.data)
].join('.');
// 48:88:1F:C9:B0:BA.8d8d52b6-ab21-4984-8abc-c5640b2e107e.{"event":"Normalruf","position":"Haupteingang","closed":false}

const hash = CryptoJS.HmacSHA256(hashString, 'secret').toString();
// 5ef777799388eb3a38a6c52d055232fa30ba5174ad32d6dcbacbb5aaf9e18ae2

request.hash = hash;

Rückmeldung bei ungültigem Hash

Ist der Hash eines API-Requests ungültig, wird eine HTTP-Response mit Status 400 Bad Request zurückgegeben.

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
    "success": false,
    "messages": [
        {
            "code":  "invalid_hash",
            "status_code": 400,
            "errors": "Ungültiger Hash"
        }
    ]
}