Authentifizierung

Die CheckYout Partner API verwendet zwei Authentifizierungsmechanismen: einen API-Key für Ihre Anfragen an CheckYout und ein Webhook-Secret zur Verifizierung der Events, die CheckYout an Sie sendet.

API-Key

Der API-Key authentifiziert Ihre Anfragen an die CheckYout API (z.B. POST /api/v1/notify). Er wird im CheckYout-Dashboard unter Einstellungen → API-Keys erstellt.

Format

EigenschaftWert
Prefixcyo_
LängePrefix + 32 hexadezimale Zeichen
Beispielcyo_a1b2c3d4e5f6...
SpeicherungSHA-256-gehasht (Klartext wird nur einmal angezeigt)

Nur einmal sichtbar

Der API-Key wird bei der Erstellung einmalig im Klartext angezeigt. Danach speichert CheckYout nur den SHA-256-Hash. Verlieren Sie den Key, müssen Sie einen neuen erstellen.

Verwendung

Senden Sie den API-Key im X-API-Key-Header mit jeder Anfrage:

curl -X POST https://checkyout.app/api/v1/notify \
  -H "Content-Type: application/json" \
  -H "X-API-Key: cyo_IhrApiKey" \
  -d '{"device_id": "...", "phone": "+41..."}'

Webhook-Signatur

Wenn Sie beim API-Key ein Webhook-Secret hinterlegt haben, signiert CheckYout jeden Webhook mit HMAC-SHA256. Die Signatur wird im Header X-CheckYout-Signature als Hexadezimal-String mitgesendet.

HeaderWert
X-CheckYout-SignatureHMAC-SHA256 Hex-Digest des JSON-Body mit Ihrem Webhook-Secret

Signatur verifizieren

Berechnen Sie den HMAC-SHA256 des rohen Request-Body mit Ihrem Webhook-Secret und vergleichen Sie das Ergebnis mit dem Wert im Header:

const crypto = require('crypto');

function verifySignature(body, secret, signature) {
  const expected = crypto
    .createHmac('sha256', secret)
    .update(JSON.stringify(body))
    .digest('hex');

  return crypto.timingSafeEqual(
    Buffer.from(expected, 'hex'),
    Buffer.from(signature, 'hex')
  );
}

// In Ihrem Webhook-Handler:
app.post('/webhooks/checkyout', (req, res) => {
  const signature = req.headers['x-checkyout-signature'];
  const secret = process.env.CHECKYOUT_WEBHOOK_SECRET;

  if (secret && signature) {
    if (!verifySignature(req.body, secret, signature)) {
      return res.status(401).json({ error: 'Invalid signature' });
    }
  }

  // Event verarbeiten...
  res.status(200).json({ received: true });
});

Hinweis zur Python-Signatur

CheckYout serialisiert den Body mit JSON.stringify() (JavaScript). Stellen Sie sicher, dass Ihre Serialisierung dasselbe Format erzeugt — ohne zusätzliche Leerzeichen. Im Zweifelsfall verifizieren Sie gegen den rohen Request-Body statt gegen eine Neu-Serialisierung.

Best Practices

  • Speichern Sie den API-Key in einer Umgebungsvariable, nie im Quellcode.
  • Rotieren Sie den Key sofort bei Verdacht auf Kompromittierung.
  • Verwenden Sie timingSafeEqual (oder Äquivalent) beim Signaturvergleich, um Timing-Attacken zu verhindern.
  • Verifizieren Sie die Webhook-Signatur vor der Verarbeitung des Events.
  • Loggen Sie fehlgeschlagene Signaturverifikationen für Ihre Sicherheitsüberwachung.

Nächster Schritt: Webhooks im Detail