Einleitung
Um eine zusätzliche Schutzstufe beim Zugriff auf Ihre Videobibliothek hinzuzufügen oder Einschränkungen auf Benutzerebene für Ihre Inhalte anzuwenden, können Sie eine übergeben JSON Web Token (JWT) mit Ihrem Aufruf der Brightcove Playback API.
Wenn Sie noch nicht damit vertraut sind JWT's, überprüfen Sie Folgendes:
Arbeitsablauf
Gehen Sie wie folgt vor, um ein Brightcove zu erstellen JSON Web Token (JWT) und sich bei Brightcove zu registrieren:
Generieren Sie ein öffentlich-privates Schlüsselpaar
Sie (der Herausgeber) generieren ein öffentlich-privates Schlüsselpaar und stellen Brightcove den öffentlichen Schlüssel zur Verfügung. Sie verwenden den privaten Schlüssel, um Token zu signieren. Der private Schlüssel wird nicht mit Brightcove geteilt.
Es gibt viele Möglichkeiten, das öffentlich-private Schlüsselpaar zu generieren. Hier sind einige Beispiele:
Beispiel für ein Bash-Skript:
Beispielskript zum Generieren des Schlüsselpaars:
#!/bin/bash
set -euo pipefail
NAME=${1:-}
test -z "${NAME:-}" && NAME="brightcove-playback-auth-key-$(date +%s)"
mkdir "$NAME"
PRIVATE_PEM="./$NAME/private.pem"
PUBLIC_PEM="./$NAME/public.pem"
PUBLIC_TXT="./$NAME/public_key.txt"
ssh-keygen -t rsa -b 2048 -m PEM -f "$PRIVATE_PEM" -q -N ""
openssl rsa -in "$PRIVATE_PEM" -pubout -outform PEM -out "$PUBLIC_PEM" 2>/dev/null
openssl rsa -in "$PRIVATE_PEM" -pubout -outform DER | base64 > "$PUBLIC_TXT"
rm "$PRIVATE_PEM".pub
echo "Public key to saved in $PUBLIC_TXT"
Führen Sie das Skript aus:
$ bash keygen.sh
Beispiel mit Go
Beispiel mit dem Go Programmiersprache zum Generieren des Schlüsselpaars:
package main
import (
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/base64"
"encoding/pem"
"flag"
"fmt"
"io/ioutil"
"os"
"path"
"strconv"
"time"
)
func main() {
var out string
flag.StringVar(&out, "output-dir", "", "Output directory to write files into")
flag.Parse()
if out == "" {
out = "rsa-key_" + strconv.FormatInt(time.Now().Unix(), 10)
}
if err := os.MkdirAll(out, os.ModePerm); err != nil {
panic(err.Error())
}
priv, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
panic(err.Error())
}
privBytes := x509.MarshalPKCS1PrivateKey(priv)
pubBytes, err := x509.MarshalPKIXPublicKey(priv.Public())
if err != nil {
panic(err.Error())
}
privOut, err := os.OpenFile(path.Join(out, "private.pem"), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600)
if err != nil {
panic(err.Error())
}
if err := pem.Encode(privOut, &pem.Block{Type: "RSA PRIVATE KEY", Bytes: privBytes}); err != nil {
panic(err.Error())
}
pubOut, err := os.OpenFile(path.Join(out, "public.pem"), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600)
if err != nil {
panic(err.Error())
}
if err := pem.Encode(pubOut, &pem.Block{Type: "PUBLIC KEY", Bytes: pubBytes}); err != nil {
panic(err.Error())
}
var pubEnc = base64.StdEncoding.EncodeToString(pubBytes)
var pubEncOut = path.Join(out, "public_key.txt")
if err := ioutil.WriteFile(pubEncOut, []byte(pubEnc+"\n"), 0600); err != nil {
panic(err.Error())
}
fmt.Println("Public key saved in " + pubEncOut)
}
Beispiel mit node.js
Beispiel mit node.js zum Generieren des Schlüsselpaars:
var crypto = require("crypto");
var fs = require("fs");
var now = Math.floor(new Date() / 1000);
var dir = "rsa-key_" + now;
fs.mkdirSync(dir);
crypto.generateKeyPair(
"rsa",
{modulusLength: 2048},
(err, publicKey, privateKey) => {
fs.writeFile(
dir + "/public.pem",
publicKey.export({ type: "spki", format: "pem" }),
err => {}
);
fs.writeFile(
dir + "/public_key.txt",
publicKey.export({ type: "spki", format: "der" }).toString("base64") +
"\n",
err => {}
);
fs.writeFile(
dir + "/private.pem",
privateKey.export({ type: "pkcs1", format: "pem" }),
err => {}
);
}
);
console.log("Public key saved in " + dir + "/public_key.txt");
Öffentlichen Schlüssel registrieren
Sie besitzen den privaten Schlüssel und verwenden ihn, um signierte Token zu generieren. Sie geben den öffentlichen Schlüssel an Brightcove weiter, um Ihre Token zu überprüfen. Mit der Schlüssel-API können Sie Ihren öffentlichen Schlüssel bei Brightcove registrieren.
API-Details finden Sie in der Verwenden von Authentifizierungs-APIs Dokument.
Erstellen Sie ein JSON Web Token
Verlage erstellen eine JSON Web Token (JWT). Das Token wird mit dem RSA-Algorithmus unter Verwendung des SHA-256-Hash-Algorithmus signiert (in der JWT-Spezifikation als "RS256") Es werden keine anderen JWT-Algorithmen unterstützt.
Eine Teilmenge des Standards JSON Web Token claims wird zusammen mit einigen von Brightcove definierten privaten Ansprüchen verwendet. Sie erstellen eine JSON Web Token mit Ihrem privaten Schlüssel signiert.
Ansprüche auf statische URL-Zustellung
Die folgenden Ansprüche können mit der statischen URL-Bereitstellung von Brightcove verwendet werden.
Anspruch | Typ | Erforderlich | Beschreibung |
---|---|---|---|
accid |
Zeichenfolge | Die Konto-ID, die den wiedergegebenen Inhalt besitzt | |
iat |
Ganze Zahl | Zeit, zu der dieser Token ausgegeben wurde, in Sekunden seit der Epoche | |
exp |
Ganze Zahl |
Zeit, in der dieser Token nicht mehr gültig ist, in Sekunden seit der Epoche. Darf nicht länger als 30 Tage von sein iat
|
|
drules |
Zeichenfolge[] | Liste der anzuwendenden Lieferregel-Aktions-IDs. Einzelheiten finden Sie unter Lieferregeln implementieren dokumentieren. Wenn der config_id Abfrageparameter ebenfalls gesetzt ist, wird er ignoriert, da dieser Anspruch ihn überschreibt.
|
|
conid |
Zeichenfolge | Falls vorhanden, autorisiert dieses Token nur eine bestimmte Video-Cloud-Video-ID. Dies kann entweder ein DRM/HLSe-Stream oder ein Nicht-DRM-Asset sein. Muss eine gültige Video-ID sein. Beachten Sie, dass die Referenz-ID nicht unterstützt wird. |
|
pro |
Zeichenfolge | Gibt einen Schutztyp für den Fall an, dass mehrere für ein einzelnes Video verfügbar sind. Werte:
|
|
vod |
Objekt | Enthält spezifische Konfigurationsoptionen für Video-On-Demand. | |
vod.ssai |
Zeichenfolge | Ihre Konfigurations-ID für die serverseitige Anzeigeneinfügung (SSAI). Dieser Anspruch ist erforderlich um entweder einen HLS- oder einen DASH-VMAP abzurufen. |
Hier ist ein Beispiel für die JSON Web Token (JWT) behauptet, dass Sie verwenden könnten:
{
// account id: JWT is only valid for this accounts
"accid":"4590388311111",
// issued at: timestamp when the JWT was created
"iat":1575484132,
// expires: timestamp when JWT expires
"exp":1577989732,
// drules: list of delivery rule IDs to be applied
"drules": ["0758da1f-e913-4f30-a587-181db8b1e4eb"],
// content id: JWT is only valid for video ID
"conid":"5805807122222",
// protection: specify a protection type in the case where multiple are available for a single video
"pro":"aes128",
// VOD specific configuration options
"vod":{
// SSAI configuration to apply
"ssai":"efcc566-b44b-5a77-a0e2-d33333333333"
}
}
Ansprüche auf Wiedergabebeschränkungen
Die folgenden Ansprüche können mit verwendet werden Brightcove-Wiedergabebeschränkungen. Als Teil der Wiedergabebeschränkungen können Sie Folgendes implementieren:
- Wiedergaberechte
- Lizenzschlüsselschutz
- Einschränkungen für die Live-Wiedergabe
- Gleichzeitige Streams
- Gerätelimits
- Lieferregeln
Besonderheit | Anspruch | Typ | Erforderlich für die Funktion | Nur DRM | Beschreibung |
---|---|---|---|---|---|
Allgemein | accid |
Zeichenfolge | Ja | Die Konto-ID, die den wiedergegebenen Inhalt besitzt | |
iat |
Ganze Zahl | Ja | Zeit, zu der dieser Token ausgegeben wurde, in Sekunden seit der Epoche | ||
exp |
Ganze Zahl | Ja |
Nicht erforderlich, aber dringend empfohlen. Zeitpunkt, zu dem dieses Token nicht mehr gültig ist, in Sekunden seit der Epoche. Darf nicht länger als 30 Tage von sein iat
|
||
nbf |
Ganze Zahl | Zeitpunkt, ab dem dieses Token gültig ist, in Sekunden seit der Epoche. Wird nichts angegeben, ist das Token sofort verfügbar. |
|||
Wiedergaberechte | prid |
Zeichenfolge | playback_rights_id Wird verwendet, um die im Katalog für dieses Video festgelegte ID zu überschreiben. Dieses Feld ist nicht validiert |
||
tags |
<Array-Zeichenketten> | Falls vorhanden, ist dieses Token nur für Videos gültig, die die aufgelisteten Tag-Werte haben. Nur diese Videos sind zur Wiedergabe berechtigt. | |||
vids |
<Array-Zeichenketten> | Falls vorhanden, berechtigt dieses Token nur zum Abrufen von Lizenzen für eine Reihe von Video-IDs. |
|||
Lizenzschlüsselschutz | ua |
Zeichenfolge | Falls vorhanden, ist dieses Token nur für Anfragen von diesem User-Agent gültig. Dieses Feld muss keinem bestimmten Format folgen. Sie müssen den Lizenzschlüsselschutz aktiviert haben. |
||
conid |
Zeichenfolge | Falls vorhanden, autorisiert dieses Token nur den Lizenzabruf für eine bestimmte Video Cloud-Video-ID. Muss eine gültige Video-ID sein. Sie müssen den Lizenzschlüsselschutz aktiviert haben. |
|||
maxip |
Ganze Zahl | Ja | Wenn vorhanden, kann dieses Token nur von dieser Nummer mit unterschiedlichen IP-Adressen verwendet werden. Erforderlich für die Sitzungsverfolgung; nur HLSe (AES-128) Sie müssen den Lizenzschlüsselschutz aktiviert haben. |
||
maxu |
Ganze Zahl | Ja |
Wenn vorhanden, ist dieses Token nur für diese Anzahl von Lizenzanforderungen gültig.
Sie müssen den Lizenzschlüsselschutz aktiviert haben. |
||
Gleichzeitige Streams | uid |
Zeichenfolge | Ja | Ja | Die Benutzer-ID des End-Viewers. In diesem Feld werden mehrere Sitzungen korreliert, um die Stream-Parallelität zu erzwingen. Sie können eine beliebige ID verwenden (max. 64 Zeichen, begrenzt auf A-Z, a-z, 0-9 und =/, @_ .+-). Je nach Anwendungsfall empfiehlt Brightcove jedoch entweder eine Benutzerkennung zur Verfolgung von Sitzungen pro Benutzer oder eine Kontokennung zur Verfolgung von Sitzungen pro zahlendem Konto. Erforderlich für die gleichzeitige Sitzung |
climit |
Ganze Zahl | Ja | Ja | Wenn dieses Feld enthalten ist, wird die Überprüfung der Stream-Parallelität zusammen mit Lizenzverlängerungsanforderungen aktiviert. Dieser Wert gibt die zulässige Anzahl gleichzeitiger Watcher an. Erforderlich für die gleichzeitige Sitzung |
|
cbeh |
Zeichenfolge | Ja | Setzen Sie den Wert auf BLOCK_NEW um gleichzeitige Stream-Limits zu aktivieren, um jede neue Anfrage zu blockieren, auch von demselben Benutzer, wenn die maximale Anzahl von Streams erreicht ist. Stellen Sie den Wert auf ein BLOCK_NEW_USER um neue Anforderungen nur von einem neuen Benutzer zu blockieren, wenn die maximale Anzahl von Streams erreicht ist. Die Standardeinstellung blockiert den ältesten Stream, wenn die maximale Anzahl von Streams erreicht ist. |
||
sid |
Zeichenfolge | Ja |
Durch die Angabe der Sitzungs-ID des aktuellen Streams können Sie steuern, wie eine Sitzung definiert wird. Standardmäßig ist eine Sitzung als User-Agent (Browser) + IP-Adresse + Video-ID definiert.
Sie können beispielsweise die Definition der Sitzung auf IP-Adresse + Video-ID lockern |
||
Gerätegrenzen | uid |
Zeichenfolge | Ja | Ja | Die Benutzer-ID des End-Viewers. In diesem Feld werden mehrere Sitzungen korreliert, um die Stream-Parallelität zu erzwingen. Sie können eine beliebige ID verwenden (max. 64 Zeichen, begrenzt auf A-Z, a-z, 0-9 und =/, @_ .+-). Je nach Anwendungsfall empfiehlt Brightcove jedoch entweder eine Benutzerkennung zur Verfolgung von Sitzungen pro Benutzer oder eine Kontokennung zur Verfolgung von Sitzungen pro zahlendem Konto. Erforderlich zur Geräteregistrierung |
dlimit |
Ganze Zahl | Ja | Ja | Wenn dieses Feld enthalten ist, steuert es, wie viele Geräte dem angegebenen Benutzer zugeordnet werden können (uid ). Der Wert muss > sein 0 . Zuvor zulässige Geräte funktionieren weiterhin, wenn die dlimit Wert wird in späteren Anfragen gelöscht. Beispiel: Wenn der Wert auf gesetzt ist 3 kann der Benutzer auf den Geräten A, B und C spielen (alles wäre erlaubt). Der Versuch, auf Gerät D zu spielen, wird abgelehnt. Wenn der Wert auf geändert wird 1 , kann der Benutzer weiterhin auf allen 3 Geräten A, B und C spielen, es sei denn, die Geräte werden manuell gesperrt, indem Geräte mit der Playback Rights API verwaltet werden. Erforderlich zur Geräteregistrierung |
|
Lieferregeln | drules |
Zeichenfolge[] | Liste der anzuwendenden Lieferregel-Aktions-IDs. Einzelheiten finden Sie unter Lieferregeln implementieren dokumentieren.
|
Forderungen nach Stufen
Für Wiedergabebeschränkungen stehen mehrere Sicherheitspakete zur Verfügung. Einzelheiten finden Sie im Überblick: Dokument „Brightcove Playback Restrictions“
Hier finden Sie die Ansprüche, die für jedes Paket mit Wiedergabebeschränkungen verfügbar sind:
Besonderheit | Behauptungen | Sicherheitsstufe 1 | Sicherheitsstufe 2 | Sicherheitsstufe 3 |
---|---|---|---|---|
Allgemein | unfall | Ja | Ja | Ja |
iat | Ja | Ja | Ja | |
exp | Ja | Ja | Ja | |
nbf | Ja | Ja | Ja | |
Wiedergaberechte [1] | stolz | Ja | Ja | Ja |
Tags | Ja | Ja | Ja | |
Vids | Ja | Ja | Ja | |
Lizenzschlüsselschutz | ua | Nein | Ja | Ja |
konid | Nein | Ja | Ja | |
Maxip | Nein | Ja | Ja | |
Maxu | Nein | Ja | Ja | |
Gleichzeitige Streams | uid | Nein | Nein | Ja |
besteigen | Nein | Nein | Ja | |
cbeh | Nein | Nein | Ja | |
Sid | Nein | Nein | Ja | |
Generische gleichzeitige Ströme | uid | Nein | Nein | Ja |
besteigen | Nein | Nein | Ja | |
Sid | Nein | Nein | Ja | |
Geräteregistrierung | uid | Nein | Nein | Ja |
dlimit | Nein | Nein | Ja |
Token generieren
Bibliotheken sind allgemein verfügbar, um JWT-Token zu generieren. Einzelheiten finden Sie in der JSON Web Tokens Seite? ˅.
Ein Epoch & Unix-Zeitstempel-Konvertierungstool kann bei der Arbeit mit Zeitfeldern hilfreich sein.
Beispiel für ein Bash-Skript:
Beispielskript zum Generieren des JWT-Tokens:
#! /usr/bin/env bash
# Static header fields.
HEADER='{
"type": "JWT",
"alg": "RS256"
}'
payload='{
"accid": "{your_account_id}"
}'
# Use jq to set the dynamic `iat` and `exp`
# fields on the payload using the current time.
# `iat` is set to now, and `exp` is now + 1 hour. Note: 3600 seconds = 1 hour
PAYLOAD=$(
echo "${payload}" | jq --arg time_str "$(date +%s)" \
'
($time_str | tonumber) as $time_num
| .iat=$time_num
| .exp=($time_num + 60 * 60)
'
)
function b64enc() { openssl enc -base64 -A | tr '+/' '-_' | tr -d '='; }
function rs_sign() { openssl dgst -binary -sha256 -sign playback-auth-keys/private.pem ; }
JWT_HDR_B64="$(echo -n "$HEADER" | b64enc)"
JWT_PAY_B64="$(echo -n "$PAYLOAD" | b64enc)"
UNSIGNED_JWT="$JWT_HDR_B64.$JWT_PAY_B64"
SIGNATURE=$(echo -n "$UNSIGNED_JWT" | rs_sign | b64enc)
echo "$UNSIGNED_JWT.$SIGNATURE"
Führen Sie das Skript aus:
$ bash jwtgen.sh
Beispiel mit Go
Hier ist ein Beispiel für eine Go Referenzimplementierung (als CLI-Tool) zum Generieren von Token ohne Verwendung einer Drittanbieterbibliothek:
package main
import (
"crypto"
"crypto/ecdsa"
"crypto/rand"
"crypto/rsa"
"crypto/sha256"
"crypto/x509"
"encoding/base64"
"encoding/json"
"encoding/pem"
"flag"
"fmt"
"io/ioutil"
"os"
"strings"
"time"
)
// Header is the base64UrlEncoded string of a JWT header for the RS256 algorithm
const RSAHeader = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9"
// Header is the base64UrlEncoded string of a JWT header for the EC256 algorithm
const ECHeader = "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9"
// Claims represents constraints that should be applied to the use of the token
type Claims struct {
Iat float64 `json:"iat,omitempty"` // Issued At
Exp float64 `json:"exp,omitempty"` // Expires At
Accid string `json:"accid,omitempty"` // Account ID
Conid string `json:"conid,omitempty"` // Content ID
Maxu float64 `json:"maxu,omitempty"` // Max Uses
Maxip float64 `json:"maxip,omitempty"` // Max IPs
Ua string `json:"ua,omitempty"` // User Agent
}
func main() {
var key, algorithm string
c := Claims{Iat: float64(time.Now().Unix())}
flag.StringVar(&key, "key", "", "Path to private.pem key file")
flag.StringVar(&c.Accid, "account-id", "", "Account ID")
flag.StringVar(&c.Conid, "content-id", "", "Content ID (eg, video_id or live_job_id)")
flag.Float64Var(&c.Exp, "expires-at", float64(time.Now().AddDate(0, 0, 1).Unix()), "Epoch timestamp (in seconds) for when the token should stop working")
flag.Float64Var(&c.Maxu, "max-uses", 0, "Maximum number of times the token is valid for")
flag.Float64Var(&c.Maxip, "max-ips", 0, "Maximum number of unique IP addresses the token is valid for")
flag.StringVar(&c.Ua, "user-agent", "", "User Agent that the token is valid for")
flag.StringVar(&algorithm, "algo", "", "Key algorithm to use for signing. Valid: ec256, rsa256")
flag.Parse()
if key == "" {
fmt.Printf("missing required flag: -key\n\n")
flag.Usage()
os.Exit(1)
}
if algorithm == "" {
fmt.Printf("missing required flag: -algo\n\n")
flag.Usage()
os.Exit(2)
}
if algorithm != "rsa256" && algorithm != "ec256" {
fmt.Printf("missing valid value for -algo flag. Valid: rsa256, ec256\n\n")
flag.Usage()
os.Exit(3)
}
if c.Accid == "" {
fmt.Printf("missing required flag: -account-id\n\n")
flag.Usage()
os.Exit(4)
}
bs, err := json.Marshal(c)
if err != nil {
fmt.Println("failed to marshal token to json", err)
os.Exit(5)
}
kbs, err := ioutil.ReadFile(key)
if err != nil {
fmt.Println("failed to read private key", err)
os.Exit(6)
}
if algorithm == "rsa256" {
processRSA256(kbs, bs)
} else {
processEC256(kbs, bs)
}
}
func processRSA256(kbs, bs []byte) {
block, _ := pem.Decode(kbs)
if block == nil {
fmt.Println("failed to decode PEM block containing private key")
os.Exit(7)
}
if block.Type != "RSA PRIVATE KEY" {
fmt.Println("failed to decode PEM block containing private key")
os.Exit(8)
}
pKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
fmt.Println("failed to parse rsa private key", err)
os.Exit(9)
}
message := RSAHeader + "." + base64.RawURLEncoding.EncodeToString(bs)
hash := crypto.SHA256
hasher := hash.New()
_, _ = hasher.Write([]byte(message))
hashed := hasher.Sum(nil)
r, err := rsa.SignPKCS1v15(rand.Reader, pKey, hash, hashed)
if err != nil {
fmt.Println("failed to sign token", err)
os.Exit(10)
}
sig := strings.TrimRight(base64.RawURLEncoding.EncodeToString(r), "=")
fmt.Println(message + "." + sig)
}
func processEC256(kbs, bs []byte) {
block, _ := pem.Decode(kbs)
if block == nil {
fmt.Println("failed to decode PEM block containing private key")
os.Exit(7)
}
if block.Type != "EC PRIVATE KEY" {
fmt.Println("failed to decode PEM block containing private key")
os.Exit(8)
}
pkey, err := x509.ParseECPrivateKey(block.Bytes)
if err != nil {
fmt.Println("failed to parse ec private key", err)
os.Exit(9)
}
message := ECHeader + "." + base64.RawURLEncoding.EncodeToString(bs)
hash := sha256.Sum256([]byte(message))
r, s, err := ecdsa.Sign(rand.Reader, pkey, hash[:])
if err != nil {
fmt.Println("failed to sign token", err)
os.Exit(10)
}
curveBits := pkey.Curve.Params().BitSize
keyBytes := curveBits / 8
if curveBits%8 > 0 {
keyBytes++
}
rBytes := r.Bytes()
rBytesPadded := make([]byte, keyBytes)
copy(rBytesPadded[keyBytes-len(rBytes):], rBytes)
sBytes := s.Bytes()
sBytesPadded := make([]byte, keyBytes)
copy(sBytesPadded[keyBytes-len(sBytes):], sBytes)
out := append(rBytesPadded, sBytesPadded...)
sig := base64.RawURLEncoding.EncodeToString(out)
fmt.Println(message + "." + sig)
}
Ergebnisse
Hier ist ein Beispiel für ein dekodiertes Token mit https://JWT.io Angabe des vollständigen Anspruchssatzes:
KOPFZEILE:
{
"alg": "RS256",
"type": "JWT"
}
NUTZLAST:
{
"accid": "1100863500123",
"conid": "51141412620123",
"exp": 1554200832,
"iat": 1554199032,
"maxip": 10,
"maxu": 10,
"ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
}
Wiedergabe testen
Obwohl dies nicht erforderlich ist, sollten Sie die Videowiedergabe testen, bevor Sie einen Player konfigurieren.
Statische URL-Zustellung
Wiedergabe anfordern:
curl -X GET \
https://edge.api.brightcove.com/playback/v1/accounts/{account_id}/videos/{video_id}/master.m3u8?bcov_auth={jwt}
Eine Liste der statischen URL-Endpunkte finden Sie unter Statische URL-Zustellung dokumentieren.
Wiedergabebeschränkungen
Wiedergabe anfordern:
curl -X GET \
-H 'Authorization: Bearer {JWT}' \
https://edge-auth.api.brightcove.com/playback/v1/accounts/{your_account_id}/videos/{your_video_id}