API Abfragen via Webhook push - Beispielimplementierungen in Python und PHP

Alternativ zur API Abfrage per API-GET-Calls und sinnvoller für eine asynchrone Verarbeitung ist die Nutzung unseres Webhooks. Dazu benötigen wir eine URL, die wir als Ziel für den PUSH-Vorgang der durch den Webhook ausgelöst wird angeben. Danach werden die Texte direkt nach der Generierung automatisch an diese URL versendet.

Da unser Service über die Amazoncloud gehostet wird, können unsere Anfragen tendenziell von einer großen Range an IP Adressen versendet werden. Ein eingeschränkter Zugriff über eine IP Begrenzung (Whitelisting) sollte dementsprechend als alleinige Zugriffsbeschränkung vermieden werden.

Um die Authentifizierung/Verifizierung der Anfragen zu erleichtern, liefern wir ein aus Ihrem API-Token errechnetes HMAC im Webhook header mit. Zum API-Token ist zu beachten, dass zum Berechnen des HMAC das API-Token des Accounts verwendet wird dem das Content Project gehört.

Verarbeitungsbeispiel 1 in Python:

import hmac
import hashlib

def signature_valid(request, raw_data):
    try:
        secret = AX_API_TOKEN  #take the API token from content project owner, the person who created the content project
        signature_header = request.META['X-MYAX-SIGNATURE'].replace('sha1=', '') #remove ‘sha1=’ before HMAC calculation
        signature_content = hmac.new(
            key=secret.encode('utf-8'),
            msg=raw_data,   # unparsed json content of the webhook request
            digestmod=hashlib.sha1
        ).hexdigest()
    except AttributeError:
        pass
    except KeyError:
        pass
    except Exception:
        raise
    else:
        return bool(signature_header == signature_content)
return False

Verarbeitungsbeispiel 2 in PHP:

  • Important note 1: The variable in the header is actually named X-MYAX-SIGNATURE, but PHP seems to convert it to HTTP_X_MYAX_SIGNATURE, because it does not know this header variable. Make sure to use the right one.
  • Important note 2: For $sApiKey take the API token from content project owner, the person who created the content project.
  • Important note 3: Remove the ‘sha1=’ before HMAC calculation to ensure the right result.

$aHttpHead = isset($_SERVER) ? $_SERVER : [];
$sHttpBody = file_get_contents(‘php://input’);
$sApiKey = ‘…’;
$sSignature = NULL;

if(isset($aHttpHead[‘HTTP_X_MYAX_SIGNATURE’])) {
$sSignature = $aHttpHead[‘HTTP_X_MYAX_SIGNATURE’];
} elseif(isset($aHttpHead[‘http_x_myax_signature’])) {
$sSignature = $aHttpHead[‘http_x_myax_signature’];
}

if($sSignature !== NULL) {
$sChecksum = hash_hmac(‘sha1’, $sHttpBody, $sApiKey, FALSE);
if($sSignature == ‘sha1=’.$sChecksum || $sSignature == $sChecksum) {
if(($aData = json_decode($sHttpBody, TRUE))) {
//…
}
}
}