← Cloudflare Stream / stream / viewing-videos
Zabezpečte svůj Stream
Podepsané URL adresy / tokeny
Videa ve Stream může standardně přehrát kdokoli, kdo má jejich video id. Pokud chcete své video standardně učinit privátním a přístup umožnit jen vybraným uživatelům, můžete použít funkci signed URL. Jakmile u videa vyžadujete signed URL, nelze k němu veřejně přistupovat pouze pomocí video id. Uživatel bude místo toho potřebovat token signed url pro přehrání nebo stažení videa.
Podepsané URL adresy se běžně používají v těchto případech:
- Omezení přístupu tak, aby dané video mohli sledovat pouze přihlášení členové
- Umožněte uživatelům sledovat vaše video jen po omezenou dobu (např. 24 hodin)
- Omezení přístupu na základě geolokace
Vyžadování podepsaných URL adres pro video
Zapněte requireSignedURLs k ochraně videa pomocí podepsaných URL adres. Tato možnost zabrání libovolné veřejné odkazy, jako je customer-<CODE>.cloudflarestream.com/<VIDEO_ID>/watch nebo vestavěnému přehrávači fungovat.
Přehrávání videa omezíte úpravou jeho metadat.
curl "https://api.cloudflare.com/client/v4/accounts/{account_id}/stream/{video_uid}" \
--header "Authorization: Bearer <API_TOKEN>" \
--header "Content-Type: application/json"
--data "{\"uid\": \"<VIDEO_UID>\", \"requireSignedURLs\": true }"Odpověď:
{
"result": {
"uid": "<VIDEO_UID>",
...
"requireSignedURLs": true
},
"success": true,
"errors": [],
"messages": []
}Workers binding
Podepsané adresy URL můžete vyžadovat i pomocí Stream binding ve svém Workeru. Viz Propojení s API Workers pro pokyny k nastavení.
export default {
async fetch(request, env) {
const video = await env.STREAM.video("VIDEO_ID").update({
requireSignedURLs: true,
});
return Response.json(video);
},
};export default {
async fetch(request, env) {
const video = await env.STREAM.video("VIDEO_ID").update({
requireSignedURLs: true,
});
return Response.json(video);
},
};Tři způsoby generování podepsaných tokenů
Svou aplikaci můžete naprogramovat tak, aby generovala tokeny třemi způsoby:
-
Nízký objem provozu nebo testování: Použijte
/tokenendpoint pro vygenerování krátkodobě platného podepsaného tokenu. Toto doporučujeme pro testovací účely nebo pokud generujete méně než 1,000 tokenů denně. Vyžaduje to volání API Cloudflare pro každý token, což podléhá rate limiting. Výchozí výsledek je platný 1 hodinu. Tato metoda nepodporuje Živé WebRTC. -
Doporučeno: K vytváření tokenů použijte podpisový klíč. Pokud máte tisíce denních uživatelů nebo potřebujete generovat velké množství tokenů, jako například u Živé WebRTC, můžete si tokeny vytvářet sami pomocí podpisového klíče. Díky tomu nemusíte při každém generování tokenu volat Stream API, a je proto ne operace s omezenou frekvencí volání (rate limiting).
-
Workers binding: K generování tokenů použijte Stream binding. Pokud používáte Cloudflare Workers s vazbou Stream, můžete generovat tokeny přímo, bez samostatného volání API nebo správy podpisových klíčů. Pro uživatele Workers jde o nejjednodušší řešení. Potřebujete-li pokročilejší přizpůsobení, jako jsou pravidla přístupu nebo vlastní doba platnosti, použijte místo toho podpisový klíč.
Možnost 1: Použití koncového bodu /token
Můžete zavolat /token endpoint pro libovolné video označené jako soukromé a získat tak token podepsané adresy URL, jehož platnost vyprší za jednu hodinu. Tato metoda nepodporuje Živé WebRTC.
curl --request POST \
https://api.cloudflare.com/client/v4/accounts/{account_id}/stream/{video_uid}/token \
--header "Authorization: Bearer <API_TOKEN>"Pokud bude požadavek úspěšný, uvidíte odpověď podobnou této:
{
"result": {
"token": "eyJhbGciOiJSUzI1NiIsImtpZCI6ImNkYzkzNTk4MmY4MDc1ZjJlZjk2MTA2ZDg1ZmNkODM4In0.eyJraWQiOiJjZGM5MzU5ODJmODA3NWYyZWY5NjEwNmQ4NWZjZDgzOCIsImV4cCI6IjE2MjE4ODk2NTciLCJuYmYiOiIxNjIxODgyNDU3In0.iHGMvwOh2-SuqUG7kp2GeLXyKvMavP-I2rYCni9odNwms7imW429bM2tKs3G9INms8gSc7fzm8hNEYWOhGHWRBaaCs3U9H4DRWaFOvn0sJWLBitGuF_YaZM5O6fqJPTAwhgFKdikyk9zVzHrIJ0PfBL0NsTgwDxLkJjEAEULQJpiQU1DNm0w5ctasdbw77YtDwdZ01g924Dm6jIsWolW0Ic0AevCLyVdg501Ki9hSF7kYST0egcll47jmoMMni7ujQCJI1XEAOas32DdjnMvU8vXrYbaHk1m1oXlm319rDYghOHed9kr293KM7ivtZNlhYceSzOpyAmqNFS7mearyQ"
},
"success": true,
"errors": [],
"messages": []
}Workers binding
Podepsaný token můžete vygenerovat pomocí Stream binding:
export default {
async fetch(request, env) {
const token = await env.STREAM.video("VIDEO_ID").generateToken();
return Response.json({ token });
},
};export default {
async fetch(request, env) {
const token = await env.STREAM.video("VIDEO_ID").generateToken();
return Response.json({ token });
},
};Chcete-li video vykreslit nebo použít prostředky jako manifesty či náhledové obrázky, použijte token hodnotu místo ID videa nebo vstupu. Pokud chcete například použít přehrávač Stream, nahraďte ID mezi cloudflarestream.com/ a /iframe s tokenem: https://customer-<CODE>.cloudflarestream.com/<TOKEN>/iframe.
<iframe
src="https://customer-<CODE>.cloudflarestream.com/eyJhbGciOiJSUzI1NiIsImtpZCI6ImNkYzkzNTk4MmY4MDc1ZjJlZjk2MTA2ZDg1ZmNkODM4In0.eyJraWQiOiJjZGM5MzU5ODJmODA3NWYyZWY5NjEwNmQ4NWZjZDgzOCIsImV4cCI6IjE2MjE4ODk2NTciLCJuYmYiOiIxNjIxODgyNDU3In0.iHGMvwOh2-SuqUG7kp2GeLXyKvMavP-I2rYCni9odNwms7imW429bM2tKs3G9INms8gSc7fzm8hNEYWOhGHWRBaaCs3U9H4DRWaFOvn0sJWLBitGuF_YaZM5O6fqJPTAwhgFKdikyk9zVzHrIJ0PfBL0NsTgwDxLkJjEAEULQJpiQU1DNm0w5ctasdbw77YtDwdZ01g924Dm6jIsWolW0Ic0AevCLyVdg501Ki9hSF7kYST0egcll47jmoMMni7ujQCJI1XEAOas32DdjnMvU8vXrYbaHk1m1oXlm319rDYghOHed9kr293KM7ivtZNlhYceSzOpyAmqNFS7mearyQ/iframe"
style="border: none;"
height="720"
width="1280"
allow="accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;"
allowfullscreen="true"
></iframe>Podobně, pokud používáte vlastní přehrávač, získejte manifest HLS nebo DASH tak, že v URL adrese manifestu nahradíte ID videa hodnotou token hodnotu:
https://customer-<CODE>.cloudflarestream.com/<TOKEN>/manifest/video.m3u8https://customer-<CODE>.cloudflarestream.com/<TOKEN>/manifest/video.mpd
Přizpůsobení výchozích omezení
Pokud zavoláte /token endpoint bez těla požadavku, vrátí token, jehož platnost vyprší za jednu hodinu, bez dalších omezení nebo přístupu k stažené soubory. Tento token lze přizpůsobit doplněním dalších vlastností v požadavku:
const signed_url_restrictions = {
// Extend the lifetime of the token to 12 hours:
exp: Math.floor(Date.now() / 1000) + 12 * 60 * 60,
// Allow access to MP4 or Audio Download URLs:
downloadable: true,
// Geo or IP access restrictions:
accessRules: {
// ... see examples below
}
};
const init = {
method: "POST",
headers: {
Authorization: "Bearer <API_TOKEN>",
"content-type": "application/json;charset=UTF-8",
},
body: JSON.stringify(signed_url_restrictions),
};
const signedurl_service_response = await fetch(
"https://api.cloudflare.com/client/v4/accounts/{account_id}/stream/{video_uid}/token",
init,
);
return new Response(
JSON.stringify(await signedurl_service_response.json()),
{ status: 200 },
);Pokud však tokeny generujete programově nebo přidáváte podobná přizpůsobení, je rychlejší a lépe škálovatelné použít podpisový klíč a token vygenerovat přímo ve vaší aplikaci.
Možnost 2: Použití Stream binding
Pokud ve svém Workeru používáte vazbu Stream (Stream binding), můžete generovat podepsané tokeny bez samostatného volání API na /token endpoint nebo si sami spravovat podpisové klíče. Binding generování tokenu zajišťuje interně.
Viz Propojení s API Workers pro pokyny k nastavení.
export default {
async fetch(request, env) {
const token = await env.STREAM.video("VIDEO_ID").generateToken();
return Response.json({ token });
},
};export default {
async fetch(request, env) {
const token = await env.STREAM.video("VIDEO_ID").generateToken();
return Response.json({ token });
},
};Token vygenerovaný bindingem ve výchozím nastavení vyprší po jedné hodině. Pokud potřebujete upravit omezení, jako je doba platnosti, geolokace nebo přístup ke stažení, použijte podpisový klíč k vytváření tokenů s vlastními claims.
Možnost 3: Použití podepisovacího klíče k vytvoření podepsaných tokenů
Pokud generujete velké množství tokenů, je použití Živé WebRTC, nebo potřebujete přizpůsobit přístupová pravidla, generujte nové tokeny pomocí podpisového klíče, abyste nemuseli pokaždé volat Stream API.
Krok 1: Zavolejte /stream/key endpoint jednou k získání klíče
curl --request POST \
"https://api.cloudflare.com/client/v4/accounts/{account_id}/stream/keys" \
--header "Authorization: Bearer <API_TOKEN>"Odpověď vrátí pem a jwk hodnoty.
{
"result": {
"id": "8f926b2b01f383510025a78a4dcbf6a",
"pem": "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBemtHbXhCekFGMnBIMURiWmgyVGoyS3ZudlBVTkZmUWtNeXNCbzJlZzVqemRKTmRhCmtwMEphUHhoNkZxOTYveTBVd0lBNjdYeFdHb3kxcW1CRGhpdTVqekdtYW13NVgrYkR3TEdTVldGMEx3QnloMDYKN01Rb0xySHA3MDEycXBVNCtLODUyT1hMRVVlWVBrOHYzRlpTQ2VnMVdLRW5URC9oSmhVUTFsTmNKTWN3MXZUbQpHa2o0empBUTRBSFAvdHFERHFaZ3lMc1Vma2NsRDY3SVRkZktVZGtFU3lvVDVTcnFibHNFelBYcm9qaFlLWGk3CjFjak1yVDlFS0JCenhZSVEyOVRaZitnZU5ya0t4a2xMZTJzTUFML0VWZkFjdGkrc2ZqMkkyeEZKZmQ4aklmL2UKdHBCSVJZVDEza2FLdHUyYmk0R2IrV1BLK0toQjdTNnFGODlmTHdJREFRQUJBb0lCQUYzeXFuNytwNEtpM3ZmcgpTZmN4ZmRVV0xGYTEraEZyWk1mSHlaWEFJSnB1MDc0eHQ2ZzdqbXM3Tm0rTFVhSDV0N3R0bUxURTZacy91RXR0CjV3SmdQTjVUaFpTOXBmMUxPL3BBNWNmR2hFN1pMQ2wvV2ZVNXZpSFMyVDh1dGlRcUYwcXpLZkxCYk5kQW1MaWQKQWl4blJ6UUxDSzJIcmlvOW1KVHJtSUUvZENPdG80RUhYdHpZWjByOVordHRxMkZrd3pzZUdaK0tvd09JaWtvTgp2NWFOMVpmRGhEVG0wdG1Vd0tLbjBWcmZqalhRdFdjbFYxTWdRejhwM2xScWhISmJSK29PL1NMSXZqUE16dGxOCm5GV1ZEdTRmRHZsSjMyazJzSllNL2tRVUltT3V5alY3RTBBcm5vR2lBREdGZXFxK1UwajluNUFpNTJ6aTBmNloKdFdvwdju39xOFJWQkwxL2tvWFVmYk00S04ydVFadUdjaUdGNjlCRDJ1S3o1eGdvTwowVTBZNmlFNG9Cek5GUW5hWS9kayt5U1dsQWp2MkgraFBrTGpvZlRGSGlNTmUycUVNaUFaeTZ5cmRkSDY4VjdIClRNRllUQlZQaHIxT0dxZlRmc00vRktmZVhWY1FvMTI1RjBJQm5iWjNSYzRua1pNS0hzczUyWE1DZ1lFQTFQRVkKbGIybDU4blVianRZOFl6Uk1vQVo5aHJXMlhwM3JaZjE0Q0VUQ1dsVXFZdCtRN0NyN3dMQUVjbjdrbFk1RGF3QgpuTXJsZXl3S0crTUEvU0hlN3dQQkpNeDlVUGV4Q3YyRW8xT1loMTk3SGQzSk9zUythWWljemJsYmJqU0RqWXVjCkdSNzIrb1FlMzJjTXhjczJNRlBWcHVibjhjalBQbnZKd0k5aUpGVUNnWUVBMjM3UmNKSEdCTjVFM2FXLzd3ekcKbVBuUm1JSUczeW9UU0U3OFBtbHo2bXE5eTVvcSs5aFpaNE1Fdy9RbWFPMDF5U0xRdEY4QmY2TFN2RFh4QWtkdwpWMm5ra0svWWNhWDd3RHo0eWxwS0cxWTg3TzIwWWtkUXlxdjMybG1lN1JuVDhwcVBDQTRUWDloOWFVaXh6THNoCkplcGkvZFhRWFBWeFoxYXV4YldGL3VzQ2dZRUFxWnhVVWNsYVlYS2dzeUN3YXM0WVAxcEwwM3h6VDR5OTBOYXUKY05USFhnSzQvY2J2VHFsbGVaNCtNSzBxcGRmcDM5cjIrZFdlemVvNUx4YzBUV3Z5TDMxVkZhT1AyYk5CSUpqbwpVbE9ldFkwMitvWVM1NjJZWVdVQVNOandXNnFXY21NV2RlZjFIM3VuUDVqTVVxdlhRTTAxNjVnV2ZiN09YRjJyClNLYXNySFVDZ1lCYmRvL1orN1M3dEZSaDZlamJib2h3WGNDRVd4eXhXT2ZMcHdXNXdXT3dlWWZwWTh4cm5pNzQKdGRObHRoRXM4SHhTaTJudEh3TklLSEVlYmJ4eUh1UG5pQjhaWHBwNEJRNTYxczhjR1Z1ZSszbmVFUzBOTDcxZApQL1ZxUWpySFJrd3V5ckRFV2VCeEhUL0FvVEtEeSt3OTQ2SFM5V1dPTGJvbXQrd3g0NytNdWc9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=",
"jwk": "eyJ1c2UiOiJzaWciLCJrdHkiOiJSU0EiLCJraWQiOiI4ZjkyNmIyYjAxZjM4MzUxNzAwMjVhNzhhNGRjYmY2YSIsImFsZyI6IlJTMjU2IiwibiI6InprR214QnpBRjJwSDFEYlpoMlRqMkt2bnZQVU5GZlFrTXlzQm8yZWc1anpkSk5kYWtwMEphUHhoNkZxOTZfeTBVd0lBNjdYeFdHb3kxcW1CRGhpdTVqekdtYW13NVgtYkR3TEdTVldGMEx3QnloMDY3TVFvTHJIcDcwMTJxcFU0LUs4NTJPWExFVWVZUGs4djNGWlNDZWcxV0tFblREX2hKaFVRMWxOY0pNY3cxdlRtR2tqNHpqQVE0QUhQX3RxRERxWmd5THNVZmtjbEQ2N0lUZGZLVWRrRVN5b1Q1U3JxYmxzRXpQWHJvamhZS1hpNzFjak1yVDlFS0JCenhZSVEyOVRaZi1nZU5ya0t4a2xMZTJzTUFMX0VWZkFjdGktc2ZqMkkyeEZKZmQ4aklmX2V0cEJJUllUMTNrYUt0dTJiaTRHYi1XUEstS2hCN1M2cUY4OWZMdyIsImUiOiJBUUFCIiwiZCI6IlhmS3FmdjZuZ3FMZTktdEo5ekY5MVJZc1ZyWDZFV3RreDhmSmxjQWdtbTdUdmpHM3FEdU9henMyYjR0Um9mbTN1MjJZdE1UcG16LTRTMjNuQW1BODNsT0ZsTDJsX1VzNy1rRGx4OGFFVHRrc0tYOVo5VG0tSWRMWlB5NjJKQ29YU3JNcDhzRnMxMENZdUowQ0xHZEhOQXNJcllldUtqMllsT3VZZ1Q5MEk2MmpnUWRlM05oblN2MW42MjJyWVdURE94NFpuNHFqQTRpS1NnMl9sbzNWbDhPRU5PYlMyWlRBb3FmUld0LU9OZEMxWnlWWFV5QkRQeW5lVkdxRWNsdEg2Zzc5SXNpLU04ek8yVTJjVlpVTzdoOE8tVW5mYVRhd2xnei1SQlFpWTY3S05Yc1RRQ3VlZ2FJQU1ZVjZxcjVUU1Ai2odx5iT0xSX3BtMWFpdktyUSIsInAiOiI5X1o5ZUpGTWI5X3E4UlZCTDFfa29YVWZiTTRLTjJ1UVp1R2NpR0Y2OUJEMnVLejV4Z29PMFUwWTZpRTRvQnpORlFuYVlfZGsteVNXbEFqdjJILWhQa0xqb2ZURkhpTU5lMnFFTWlBWnk2eXJkZEg2OFY3SFRNRllUQlZQaHIxT0dxZlRmc01fRktmZVhWY1FvMTI1RjBJQm5iWjNSYzRua1pNS0hzczUyWE0iLCJxIjoiMVBFWWxiMmw1OG5VYmp0WThZelJNb0FaOWhyVzJYcDNyWmYxNENFVENXbFVxWXQtUTdDcjd3TEFFY243a2xZNURhd0JuTXJsZXl3S0ctTUFfU0hlN3dQQkpNeDlVUGV4Q3YyRW8xT1loMTk3SGQzSk9zUy1hWWljemJsYmJqU0RqWXVjR1I3Mi1vUWUzMmNNeGNzMk1GUFZwdWJuOGNqUFBudkp3STlpSkZVIiwiZHAiOiIyMzdSY0pIR0JONUUzYVdfN3d6R21QblJtSUlHM3lvVFNFNzhQbWx6Nm1xOXk1b3EtOWhaWjRNRXdfUW1hTzAxeVNMUXRGOEJmNkxTdkRYeEFrZHdWMm5ra0tfWWNhWDd3RHo0eWxwS0cxWTg3TzIwWWtkUXlxdjMybG1lN1JuVDhwcVBDQTRUWDloOWFVaXh6THNoSmVwaV9kWFFYUFZ4WjFhdXhiV0ZfdXMiLCJkcSI6InFaeFVVY2xhWVhLZ3N5Q3dhczRZUDFwTDAzeHpUNHk5ME5hdWNOVEhYZ0s0X2NidlRxbGxlWjQtTUswcXBkZnAzOXIyLWRXZXplbzVMeGMwVFd2eUwzMVZGYU9QMmJOQklKam9VbE9ldFkwMi1vWVM1NjJZWVdVQVNOandXNnFXY21NV2RlZjFIM3VuUDVqTVVxdlhRTTAxNjVnV2ZiN09YRjJyU0thc3JIVSIsInFpIjoiVzNhUDJmdTB1N1JVWWVubzIyNkljRjNBaEZzY3NWam55NmNGdWNGanNIbUg2V1BNYTU0dS1MWFRaYllSTFBCOFVvdHA3UjhEU0NoeEhtMjhjaDdqNTRnZkdWNmFlQVVPZXRiUEhCbGJudnQ1M2hFdERTLTlYVF8xYWtJNngwWk1Mc3F3eEZuZ2NSMF93S0V5Zzh2c1BlT2gwdlZsamkyNkpyZnNNZU9fakxvIn0=",
"created": "2021-06-15T21:06:54.763937286Z"
},
"success": true,
"errors": [],
"messages": []
}Tyto hodnoty se znovu nezobrazí, proto doporučujeme je ihned bezpečně uložit. Pokud používáte Cloudflare Workers, můžete je uložit pomocí Tajné klíče. Pokud používáte jinou platformu, uložte je do zabezpečených proměnných prostředí.
Tyto hodnoty později použijete k vygenerování tokenů. Pole pem a jwk jsou kódovaná v base64, proto je před použitím musíte dekódovat (příklad je uveden v kroku 2).
Krok 2: Vygenerujte tokeny pomocí klíče
Jakmile v kroku 1 vygenerujete klíč, můžete použít pem nebo jwk hodnoty k samostatnému generování vlastnoručně podepsaných URL adres. Při použití této metody nemusíte při každém vytváření nového tokenu volat Stream API.
Následující ukázkový skript Cloudflare Worker generuje tokeny, které vyprší za 60 minut a fungují pouze pro uživatele přistupující k videu ze Spojeného království. Na řádcích 2 a 3 nastavíte id a jwk hodnoty z kroku 1:
// Global variables
const jwkKey = "{PRIVATE-KEY-IN-JWK-FORMAT}";
const keyID = "<KEY_ID>";
const videoUID = "<VIDEO_UID>";
// expiresTimeInS is the expired time in second of the video
const expiresTimeInS = 3600;
// Main function
async function streamSignedUrl() {
const encoder = new TextEncoder();
const expiresIn = Math.floor(Date.now() / 1000) + expiresTimeInS;
const headers = {
alg: "RS256",
kid: keyID,
};
const data = {
sub: videoUID,
kid: keyID,
exp: expiresIn,
// Add `downloadable` boolean for access to MP4 or Audio Downloads:
// downloadable: true,
accessRules: [
{
type: "ip.geoip.country",
action: "allow",
country: ["GB"],
},
{
type: "any",
action: "block",
},
],
};
const token = `${objectToBase64url(headers)}.${objectToBase64url(data)}`;
const jwk = JSON.parse(atob(jwkKey));
const key = await crypto.subtle.importKey(
"jwk",
jwk,
{
name: "RSASSA-PKCS1-v1_5",
hash: "SHA-256",
},
false,
["sign"],
);
const signature = await crypto.subtle.sign(
{ name: "RSASSA-PKCS1-v1_5" },
key,
encoder.encode(token),
);
const signedToken = `${token}.${arrayBufferToBase64Url(signature)}`;
return signedToken;
}
// Utilities functions
function arrayBufferToBase64Url(buffer) {
return btoa(String.fromCharCode(...new Uint8Array(buffer)))
.replace(/=/g, "")
.replace(/\+/g, "-")
.replace(/\//g, "_");
}
function objectToBase64url(payload) {
return arrayBufferToBase64Url(
new TextEncoder().encode(JSON.stringify(payload)),
);
}Krok 3: Vykreslení videa
Pokud používáte přehrávač Stream, vložte token vrácenou Workerem v kroku 2 místo video id, čímž nahradíte celý řetězec umístěný mezi cloudflarestream.com/ a /iframe:
<iframe
src="https://customer-<CODE>.cloudflarestream.com/eyJhbGciOiJSUzI1NiIsImtpZCI6ImNkYzkzNTk4MmY4MDc1ZjJlZjk2MTA2ZDg1ZmNkODM4In0.eyJraWQiOiJjZGM5MzU5ODJmODA3NWYyZWY5NjEwNmQ4NWZjZDgzOCIsImV4cCI6IjE2MjE4ODk2NTciLCJuYmYiOiIxNjIxODgyNDU3In0.iHGMvwOh2-SuqUG7kp2GeLXyKvMavP-I2rYCni9odNwms7imW429bM2tKs3G9INms8gSc7fzm8hNEYWOhGHWRBaaCs3U9H4DRWaFOvn0sJWLBitGuF_YaZM5O6fqJPTAwhgFKdikyk9zVzHrIJ0PfBL0NsTgwDxLkJjEAEULQJpiQU1DNm0w5ctasdbw77YtDwdZ01g924Dm6jIsWolW0Ic0AevCLyVdg501Ki9hSF7kYST0egcll47jmoMMni7ujQCJI1XEAOas32DdjnMvU8vXrYbaHk1m1oXlm319rDYghOHed9kr293KM7ivtZNlhYceSzOpyAmqNFS7mearyQ/iframe"
style="border: none;"
height="720"
width="1280"
allow="accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;"
allowfullscreen="true"
></iframe>Pokud používáte vlastní přehrávač, nahraďte ID videa v URL manifestu token hodnotu:
https://customer-<CODE>.cloudflarestream.com/eyJhbGciOiJSUzI1NiIsImtpZCI6ImNkYzkzNTk4MmY4MDc1ZjJlZjk2MTA2ZDg1ZmNkODM4In0.eyJraWQiOiJjZGM5MzU5ODJmODA3NWYyZWY5NjEwNmQ4NWZjZDgzOCIsImV4cCI6IjE2MjE4ODk2NTciLCJuYmYiOiIxNjIxODgyNDU3In0.iHGMvwOh2-SuqUG7kp2GeLXyKvMavP-I2rYCni9odNwms7imW429bM2tKs3G9INms8gSc7fzm8hNEYWOhGHWRBaaCs3U9H4DRWaFOvn0sJWLBitGuF_YaZM5O6fqJPTAwhgFKdikyk9zVzHrIJ0PfBL0NsTgwDxLkJjEAEULQJpiQU1DNm0w5ctasdbw77YtDwdZ01g924Dm6jIsWolW0Ic0AevCLyVdg501Ki9hSF7kYST0egcll47jmoMMni7ujQCJI1XEAOas32DdjnMvU8vXrYbaHk1m1oXlm319rDYghOHed9kr293KM7ivtZNlhYceSzOpyAmqNFS7mearyQ/manifest/video.m3u8
Chcete-li povolit přístup k Stahování MP4 nebo zvuku, ujistěte se, že má video již povolený typ stahování. Poté přidejte downloadable: true do datové části (payload) tak, jak je uvedeno v komentáři výše, při generování podepsané URL adresy. V URL adrese ke stažení nahraďte ID videa hodnotou token hodnotu:
https://customer-<CODE>.cloudflarestream.com/eyJhbGciOiJ.../downloads/default.mp4
Odvolání klíčů
Můžete vytvořit až 1,000 klíčů a obměňovat je podle potřeby. Po zneplatnění klíče budou zneplatněny všechny tokeny vytvořené pomocí tohoto klíče.
curl --request DELETE \
"https://api.cloudflare.com/client/v4/accounts/{account_id}/stream/keys/{key_id}" \
--header "Authorization: Bearer <API_TOKEN>"
# Response:
{
"result": "Revoked",
"success": true,
"errors": [],
"messages": []
}Podporovaná omezení
| Název vlastnosti | Popis | |
|---|---|---|
| exp | Doba platnosti. Časové razítko unix epoch, po kterém token přestane fungovat. Nesmí být více než 24 hodin v budoucnosti od okamžiku podepsání tokenu | |
| nbf | Not Before hodnotu. Časové razítko unix epoch, před kterým token nebude fungovat | |
| ke stažení | pokud je hodnota true, lze token použít ke stažení souboru mp4 (za předpokladu, že má video povoleno stahování) | |
| accessRules | Pole určující jedno nebo více omezení IP adres a geolokace. accessRules se vyhodnocují postupně od prvního po poslední. Pokud některé Rule odpovídá, použije se přiřazená akce a další pravidla se už nevyhodnocují. Token může mít v poli accessRules nejvýše 5 členů. |
Schéma accessRules
Každé pravidlo accessRule musí obsahovat 2 povinné vlastnosti:
type: podporované hodnoty jsouany,ip.srcaip.geoip.countryaction: podporované hodnoty jsouallowablock
V závislosti na typu pravidla podporuje accessRules 2 další vlastnosti:
country: pole dvoupísmenných kódů zemí v ISO 3166-1 Alpha 2 ↗ formát.ip: pole rozsahů IP adres. Pokud je to možné, doporučujeme do pravidla zahrnout varianty IPv4 i IPv6. Pokud pravidlo obsahuje jen jednu variantu, druhou bude ignorovat, takže pravidlo založené na IPv4 se nikdy nepoužije na diváka připojeného přes adresu IPv6. Před konkrétními IP adresami dávejte přednost rozsahům CIDR. Některá zařízení, například mobilní telefony, mohou během přehrávání svou IP adresu změnit. Pravidla Video Access Control se vyhodnocují průběžně po celou dobu přehrávání videa, takže příliš přísná pravidla pro IP adresy mohou přehrávání narušit.
Příklad 1: Blokování zobrazení z konkrétní země
...
"accessRules": [
{
"type": "ip.geoip.country",
"action": "block",
"country": ["US", "DE", "MX"],
},
]První pravidlo se shoduje podle země, zde US, DE a MX. Pokud toto pravidlo odpovídá, akce block označí token za neplatný. Pokud první pravidlo neodpovídá, žádná další pravidla k vyhodnocení již nejsou. V takové situaci se token považuje za platný.
Příklad 2: Povolení zobrazení jen z konkrétní země nebo IP adres
...
"accessRules": [
{
"type": "ip.geoip.country",
"country": ["US", "MX"],
"action": "allow",
},
{
"type": "ip.src",
"ip": ["93.184.216.0/24", "2400:cb00::/32"],
"action": "allow",
},
{
"type": "any",
"action": "block",
},
]První pravidlo se shoduje podle země, zde US a MX. Pokud toto pravidlo odpovídá, akce allow označí token za platný. Pokud neodpovídá, pokračuje se ve vyhodnocování dalších pravidel
Druhé pravidlo je pravidlo IP, které se shoduje podle bloků CIDR 93.184.216.0/24 a 2400:cb00::/32. Pokud toto pravidlo odpovídá, akce allow považuje pravidlo za platné.
Pokud první dvě pravidla neodpovídají, poslední pravidlo typu any zachytí všechny zbývající požadavky a příslušná zhlédnutí zablokuje.
Bezpečnostní aspekty
Hotlinking Protection
Vkládací kódy Stream lze standardně použít na jakékoli doméně. V případě potřeby můžete v dashboardu Stream omezit domény, na kterých lze video vkládat.
V dashboardu uvidíte u každého videa textové pole s označením Enter allowed origin domains separated by commas. Po kliknutí na něj můžete vypsat domény, na kterých má být možné vložený kód (embed code) Stream používat.
`
*.badtortilla.compokrýváa.badtortilla.com,a.b.badtortilla.coma nezahrnujebadtortilla.comexample.comse nevztahuje na www.example.com ↗ nebo jakoukoli subdoménu example.comlocalhostvyžaduje port, pokud není poskytován přes HTTP na portu 80 nebo přes HTTPS na portu 443- Podpora cesty není k dispozici:
example.compokrýváexample.com/\*
Omezení vkládání můžete řídit i programově pomocí Stream API. uid v příkladu níže odkazuje na ID videa.
curl https://api.cloudflare.com/client/v4/accounts/{account_id}/stream/{video_uid} \
--header "Authorization: Bearer <API_TOKEN>" \
--data "{\"uid\": \"<VIDEO_UID>\", \"allowedOrigins\": [\"example.com\"]}"Povolené originy můžete nastavit i pomocí Stream binding:
export default {
async fetch(request, env) {
const video = await env.STREAM.video("VIDEO_ID").update({
allowedOrigins: ["example.com"],
});
return Response.json(video);
},
};export default {
async fetch(request, env) {
const video = await env.STREAM.video("VIDEO_ID").update({
allowedOrigins: ["example.com"],
});
return Response.json(video);
},
};Povolené originy
Funkce Allowed Origins umožňuje určit, ze kterých zdrojů je přehrávání povoleno. Funguje i v případě, že používáte vlastní přehrávač videa. Při použití vlastního přehrávače Allowed Origins omezuje, ze které domény lze požadovat manifesty HLS/DASH a segmenty videa.
Podepsané URL
Kombinace podepsaných URL adres s omezeními vkládání vám umožňuje důsledně kontrolovat, jak jsou vaše videa zobrazována. Díky tomu můžete obsah zpřístupnit pouze důvěryhodným uživatelům a zabránit tomu, aby byla podepsaná URL adresa zveřejněna na neznámém webu.