Callbacks
Task-callback-leveringen veilig ontvangen en verifiëren.
Gebruik Callbacks om Task-levenscyclusgebeurtenissen te ontvangen op een openbaar HTTPS- eindpunt. Verifieer elke callback voordat u de JSON-body verwerkt, zodat alleen leveringen die zijn ondertekend voor uw account de applicatiestatus kunnen wijzigen.
Een callback-URL configureren
Voeg een openbare HTTPS-callback_url toe wanneer u een taak aanmaakt. De gebeurtenisinhoud en levenscyclusstatussen zijn afhankelijk van het eindpunt; raadpleeg de API-referentie van dat eindpunt voor de bijbehorende callback-payloads.
{
"model": "flux-2-pro-text-to-image",
"prompt": "A product photograph on a clean studio background",
"callback_url": "https://your-domain.com/webhooks/runapi"
}
Een Callback Secret aanmaken
Volg de Authenticatie-handleiding om u aan te melden, open vervolgens API-sleutels en maak een Callback-geheim aan voor het account dat de taak aanmaakt. Sla de waarde op in een geheimenbeheerder en maak hem uitsluitend beschikbaar voor uw callback-ontvanger. Het is geen API-sleutel en mag nooit in een taakverzoek worden verstuurd.
Het geheim ondertekent callbacks voor dat account. Het roteren ervan wijzigt de handtekening voor latere leveringen, dus werk elke callback-ontvanger onmiddellijk bij en bewaar beide waarden alleen lang genoeg om lopende leveringen af te handelen.
Een callback-handtekening verifiëren
Elke callback is een HTTP POST met Content-Type: application/json.
RunAPI voegt geen Authorization-header toe aan dit verzoek. Verifieer
deze headers voordat u de body deserialiseert:
X-Callback-Id
Unieke identificatie voor deze bezorgpoging.
X-Callback-Timestamp
Unix-tijdstempel in seconden waarop de bezorging werd ondertekend.
X-Callback-Signature
Base64-gecodeerde HMAC-SHA-256-handtekening.
Stel de ondertekende waarde als volgt samen, met de ongewijzigde bytes van de aanvraagbody:
X-Callback-Id + "." + X-Callback-Timestamp + "." + raw request body
Decodeer het Callback Secret met Base64, bereken HMAC-SHA-256 over die waarde, codeer het resultaat met Base64 en vergelijk het met X-Callback-Signature via een tijdconstante vergelijking. Parseer en herserialiseer JSON niet vóór de verificatie.
JavaScript
import { createHmac, timingSafeEqual } from "node:crypto";
export function verifyCallback({headers, rawBody, callbackSecret}) {
const callbackId = headers["x-callback-id"];
const timestamp = Number(headers["x-callback-timestamp"]);
const signature = headers["x-callback-signature"];
if (!callbackId || !signature || !Number.isSafeInteger(timestamp)) return false;
if (Math.abs(Date.now() / 1000 - timestamp) > 300) return false;
const signedContent = `${callbackId}.${timestamp}.${rawBody}`;
const expected = createHmac("sha256", Buffer.from(callbackSecret, "base64"))
.update(signedContent, "utf8")
.digest();
const received = Buffer.from(signature, "base64");
return expected.length === received.length && timingSafeEqual(expected, received);
}
Geef de onbewerkte verzoek-body-string van het framework door aan rawBody; roep JSON.stringify niet aan op geparseerde gegevens.
Python
import base64
import hashlib
import hmac
import time
def verify_callback(headers, raw_body, callback_secret):
callback_id = headers.get("X-Callback-Id")
timestamp = headers.get("X-Callback-Timestamp")
signature = headers.get("X-Callback-Signature")
if not callback_id or not timestamp or not signature:
return False
try:
timestamp = int(timestamp)
secret = base64.b64decode(callback_secret, validate=True)
received = base64.b64decode(signature, validate=True)
except (ValueError, TypeError):
return False
if abs(time.time() - timestamp) > 300:
return False
signed_content = f"{callback_id}.{timestamp}.{raw_body}".encode("utf-8")
expected = hmac.new(secret, signed_content, hashlib.sha256).digest()
return hmac.compare_digest(expected, received)
Geef de exacte onbewerkte verzoek-body-string die door uw HTTP-framework is ontvangen door als raw_body.
Leveringen veilig verwerken
- Geef alleen een
2xx-respons terug nadat de callback is geaccepteerd voor verwerking. Na een niet-2xx-respons of transportfout wordt de bezorging tot maximaal 10 keer opnieuw geprobeerd. - Reageer binnen 15 seconden. Zet trager werk in de wachtrij na verificatie in plaats van de HTTP-respons te blokkeren.
- Wijs callbacks af met ontbrekende handtekeningheaders, een ongeldige handtekening of een tijdstempel buiten het tolerantievenster dat uw ontvanger definieert.
Verificatie probleemoplossing
- Handtekeningmismatch: controleer of het Callback Secret behoort tot hetzelfde account als de taak, decodeer het met Base64 en onderteken de oorspronkelijke body in plaats van geparseerde JSON.
- Ontbrekende handtekeningheaders: maak een Callback Secret aan voordat u callbacks voor statuswijzigingen gebruikt.
- Tijdstempel geweigerd: synchroniseer de klok van de ontvanger en gebruik een tolerantie die past bij uw implementatie.
Ga voor installatie- en levenscyclusbegeleiding terug naar de Task API-snelstart.