INTEGRITY Dokumentace

Použití webhooků

Webhooky informují vaši službu, jakmile video úspěšně dokončí zpracování a je připravené ke streamování, nebo pokud přejde do chybového stavu.

Přihlaste se k odběru oznámení webhooků

Chcete-li si nechat na svou službu zasílat oznámení webhooku nebo upravit stávající odběr, vygenerujte token API na API tokeny účtu stránce v Cloudflare dashboard.

Přejděte na API tokeny účtu ↗

Adresa URL pro webhookové oznámení musí obsahovat protokol. Pouze http:// nebo https:// je podporováno.

curl -X PUT --header 'Authorization: Bearer <API_TOKEN>' \
https://api.cloudflare.com/client/v4/accounts/<ACCOUNT_ID>/stream/webhook \
--data '{"notificationUrl":"<WEBHOOK_NOTIFICATION_URL>"}'
Ukázková odpověď
{
	"result": {
		"notificationUrl": "http://www.your-service-webhook-handler.com",
		"modified": "2019-01-01T01:02:21.076571Z",
		"secret": "85011ed3a913c6ad5f9cf6c5573cc0a7"
	},
	"success": true,
	"errors": [],
	"messages": []
}

Oznámení

Jakmile video ve vašem účtu dokončí zpracování, obdržíte POST oznámení požadavku s informacemi o videu.

Ukázkové tělo požadavku POST odeslané v reakci na úspěšné zakódování
{
	"uid": "6b9e68b07dfee8cc2d116e4c51d6a957",
	"creator": null,
	"thumbnail": "https://customer-f33zs165nr7gyfy4.cloudflarestream.com/6b9e68b07dfee8cc2d116e4c51d6a957/thumbnails/thumbnail.jpg",
	"thumbnailTimestampPct": 0,
	"readyToStream": true,
	"status": {
		"state": "ready",
		"pctComplete": "39.000000",
		"errorReasonCode": "",
		"errorReasonText": ""
	},
	"meta": {
		"filename": "small.mp4",
		"filetype": "video/mp4",
		"name": "small.mp4",
		"relativePath": "null",
		"type": "video/mp4"
	},
	"created": "2022-06-30T17:53:12.512033Z",
	"modified": "2022-06-30T17:53:21.774299Z",
	"size": 383631,
	"preview": "https://customer-f33zs165nr7gyfy4.cloudflarestream.com/6b9e68b07dfee8cc2d116e4c51d6a957/watch",
	"allowedOrigins": [],
	"requireSignedURLs": false,
	"uploaded": "2022-06-30T17:53:12.511981Z",
	"uploadExpiry": "2022-07-01T17:53:12.511973Z",
	"maxSizeBytes": null,
	"maxDurationSeconds": null,
	"duration": 5.5,
	"input": {
		"width": 560,
		"height": 320
	},
	"playback": {
		"hls": "https://customer-f33zs165nr7gyfy4.cloudflarestream.com/6b9e68b07dfee8cc2d116e4c51d6a957/manifest/video.m3u8",
		"dash": "https://customer-f33zs165nr7gyfy4.cloudflarestream.com/6b9e68b07dfee8cc2d116e4c51d6a957/manifest/video.mpd"
	},
	"watermark": null
}

Kódy chyb

Pokud se video nepodařilo úspěšně zpracovat, state pole vrací error, a errReasonCode vrací jednu z hodnot uvedených níže.

Kromě state pole, u videa readyToStream pole musí být také true aby se video mohlo přehrát.

Ukázková chybová odpověď
{
  "readyToStream": false,
  "status": {
    "state": "error",
    "step": "encoding",
    "pctComplete": "39",
    "errReasonCode": "ERR_MALFORMED_VIDEO",
    "errReasonText": "The video was deemed to be corrupted or malformed.",
  }
}

Ověření pravosti webhooku

Cloudflare Stream podepíše webhookové požadavky odeslané na vaše notifikační URL adresy a podpis každého požadavku zahrne do Webhook-Signature HTTP hlavičku. Díky tomu může vaše aplikace ověřit, že webhookové požadavky odesílá Stream.

Chcete-li ověřit podpis, musíte získat tajný klíč pro podepisování webhooku. Tato hodnota se vrací v odpovědi API při vytvoření nebo načtení webhooku.

Chcete-li ověřit podpis, získejte hodnotu Webhook-Signature hlavičku, která bude vypadat podobně jako příklad níže.

Webhook-Signature: time=1230811200,sig1=60493ec9388b44585a29543bcf0de62e377d4da393246a8b1c901d0e3e672404

1. Analyzujte podpis

Načtěte Webhook-Signature hlavičku z požadavku webhooku a rozdělte řetězec pomocí , znak.

Každou hodnotu znovu rozdělte pomocí = znak.

Hodnota pro time je aktuální Unixový čas ↗ kdy server odeslal požadavek. sig1 je podpis těla požadavku.

V tomto okamžiku byste měli zahodit požadavky s časovými razítky, která jsou pro vaši aplikaci příliš stará.

2. Vytvořte zdrojový řetězec podpisu

Zdrojový řetězec podpisu připravte spojením následujících řetězců:

Aby ověření podpisu proběhlo úspěšně, nesmí být v těle požadavku změněn ani jeden bajt.

3. Vytvořte očekávaný podpis

Vypočítejte HMAC pomocí funkce SHA256 (HMAC-SHA256), a to za použití vašeho webhookového tajného klíče a zdrojového řetězce z kroku 2. Tento krok závisí na programovacím jazyce, který vaše aplikace používá.

Podpis Cloudflare bude zakódován do hexadecimální podoby.

4. Porovnejte očekávaný a skutečný podpis

Porovnejte podpis v hlavičce požadavku s očekávaným podpisem. K porovnání podpisů raději použijte funkci s konstantní dobou porovnání.

Pokud se podpisy shodují, můžete si být jisti, že webhook odeslal Cloudflare.

Omezení

Příklady

Golang

Použití crypto/hmac ↗:

package main

import (
 "crypto/hmac"
 "crypto/sha256"
 "encoding/hex"
 "log"
)

func main() {
 secret := []byte("secret from the Cloudflare API")
 message := []byte("string from step 2")

 hash := hmac.New(sha256.New, secret)
 hash.Write(message)

 hashToCheck := hex.EncodeToString(hash.Sum(nil))

 log.Println(hashToCheck)
}

Node.js

var crypto = require("crypto");

var key = "secret from the Cloudflare API";
var message = "string from step 2";

var hash = crypto.createHmac("sha256", key).update(message);

hash.digest("hex");

Ruby

    require 'openssl'

    key = 'secret from the Cloudflare API'
    message = 'string from step 2'

    OpenSSL::HMAC.hexdigest('sha256', key, message)

V JavaScriptu (například pro použití v Cloudflare Workers)

const key = "secret from the Cloudflare API";
const message = "string from step 2";

const getUtf8Bytes = (str) =>
	new Uint8Array(
		[...decodeURIComponent(encodeURIComponent(str))].map((c) =>
			c.charCodeAt(0),
		),
	);

const keyBytes = getUtf8Bytes(key);
const messageBytes = getUtf8Bytes(message);

const cryptoKey = await crypto.subtle.importKey(
	"raw",
	keyBytes,
	{ name: "HMAC", hash: "SHA-256" },
	true,
	["sign"],
);
const sig = await crypto.subtle.sign("HMAC", cryptoKey, messageBytes);

[...new Uint8Array(sig)].map((b) => b.toString(16).padStart(2, "0")).join("");