Erstellen eines JSON-Web-Tokens (JWT)

In diesem Thema erfahren Sie, wie Sie ein JSON-Web-Token (JWT) erstellen, das mit Brightcove-Wiedergabeeinschränkungen verwendet werden kann.

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:

  1. Generieren Sie ein öffentlich-privates Schlüsselpaar
  2. Öffentlichen Schlüssel bei Brightcove registrieren
  3. Ein ... kreieren JSON Web Token
  4. Wiedergabe testen

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.

Ein ... kreieren 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 String 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 im Dokument Implementing Delivery Rules .
Wenn der config_id Abfrageparameter ebenfalls gesetzt ist, wird er ignoriert, da dieser Anspruch ihn überschreibt.
conid String 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 String Gibt einen Schutztyp für den Fall an, dass mehrere für ein einzelnes Video verfügbar sind.

Werte:
  • "" (Standard für klaren Inhalt)
  • "aes128"
  • "widevine"
  • "spielbereit"
  • "faires Spiel"
vod Objekt Enthält spezifische Konfigurationsoptionen für Video-On-Demand.
vod.ssai String 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:

Besonderheit Anspruch Typ Erforderlich für die Funktion Nur DRM Beschreibung
Allgemein accid String 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 String playback_rights_id Wird verwendet, um die im Katalog für dieses Video festgelegte ID zu überschreiben.

Dieses Feld ist nicht validiert

tags Array <Strings> 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 <Strings> Falls vorhanden, berechtigt dieses Token nur zum Abrufen von Lizenzen für eine Reihe von Video-IDs.

Lizenzschlüsselschutz ua String 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 String 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.

  • Bei HLSe stellen Spieler beim Abspielen eines Videos mehrere Anfragen, normalerweise eine pro Wiedergabe. Die maxu muss hoch genug eingestellt werden, um diese zusätzlichen Anforderungen zu berücksichtigen.
Erforderlich für die Sitzungsverfolgung; nur HLSe (AES-128)
Sie müssen den Lizenzschlüsselschutz aktiviert haben.
Gleichzeitige Streams uid String 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 String 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 String 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 String 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). 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 in geändert wird 1 Der Benutzer kann weiterhin auf allen drei Geräten A, B und C spielen, es sei denn, die Geräte werden manuell widerrufen, indem Geräte mit dem verwaltet werden API für Wiedergaberechte.

Erforderlich zur Geräteregistrierung
Lieferregeln drules Zeichenfolge[] Liste der anzuwendenden Lieferregel-Aktions-IDs. Einzelheiten finden Sie im Dokument Implementing Delivery Rules .

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] prid 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
climit Nein Nein Ja
cbeh Nein Nein Ja
sid Nein Nein Ja
Generische gleichzeitige Ströme uid Nein Nein Ja
climit 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 Referenz Go Implementierung (als CLI-Tool) zum Generieren von Token ohne Verwendung einer Bibliothek eines Drittanbieters:

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:

HEADER:

{
  "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 Static URL-Endpunkte finden Sie im Dokument Static URL Delivery .

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}