Erstellen eines JSON-Web-Tokens (JWT)

In diesem Thema erfahren Sie, wie Sie ein JSON Web Token(JWT) erstellen, das mit Brightcove-Wiedergabebeschrä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. Erstellen Sie ein 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.

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:
  • "" (Standard für klaren Inhalt)
  • "aes128"
  • „breiter Wein“
  • "spielbereit"
  • "faires Spiel"
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:

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.

  • 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 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}