서문
비디오 라이브러리에 액세스할 때 추가 보호 수준을 추가하거나 콘텐츠에 사용자 수준 제한을 적용하려면 브라이트코브 Playback API에 대한 호출과 함께JSON Web Token (JWT) 를 전달할 수 있습니다. 토큰을 만들려면 다음과 같이 하십시오.
공개-개인 키 쌍 생성
게시자는 공개-개인 키 쌍을 생성하고 공개 키를 브라이트코브에 제공합니다. 비공개 키는 게시자가 토큰에 서명하는 데 사용되며 브라이트코브와 공유되지 않습니다.
공개-개인 키 쌍을 생성하는 방법에는 여러 가지가 있습니다. 다음은 몇 가지 예입니다.
bash 스크립트의 예:
키 쌍을 생성하는 예제 스크립트:
#!/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"
스크립트를 실행합니다.
$ bash keygen.sh
사용 예제Go
Go프로그래밍 언어를 사용하여 키 쌍을 생성하는 예:
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)
}
node.js 사용 예제
node.js 를 사용하여 키 쌍을 생성하는 예:
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");
공개 키 등록
Key API를 사용하여 브라이트코브에 공개 키를 등록합니다.
키 API
Key API는 브라이트코브를 통해 공개 키를 관리하는 데 사용됩니다.
기본 URL
API의 기본 URL은 다음과 같습니다.
https://playback-auth.api.brightcove.com
계정 경로
모든 경우에 특정 Video Cloud 계정에 대한 요청이 이루어집니다. 따라서 항상 용어 계정을 추가하고 계정 ID를 기본 URL에 추가합니다.
https://playback-auth.api.brightcove.com/v1/accounts/{accountID}
권한
요청에 대한 액세스 토큰이 필요하며 권한 부여 헤더에 있어야합니다.
Authorization: Bearer {access_token}
액세스 토큰은 브라이트코브 OAuth 서비스에서 가져와야 하는 임시 OAuth2 액세스 토큰입니다. 클라이언트 자격 증명을 획득하고 이를 사용하여 액세스 토큰을 검색하는 방법에 대한 자세한 내용은브라이트코브 OAuth 개요를참조하십시오.
사용 권한
키 API에 대한 요청은 다음 권한을 가진클라이언트 자격 증명에서이루어져야 합니다.
-
video-cloud/playback-auth/key/read
-
video-cloud/playback-auth/key/write
키 관리
키 API는 다음 요청을 지원합니다.
새 키 등록:
공개 키의 값을 API 요청 본문에 넣으십시오. public_key.txt파일에서 키를 찾을 수 있습니다.
요청
POST /v1/accounts/{accountID}/keys
Content-Type: application/json
Body: {"value": "MFkwEwYHKoZIzj0CAQYIKoZIzj...MyeQviqploA=="}
컬링 사용
대응
{
"id": "{your_public_key_id}",
"type": "public",
"algorithm": "rsa",
"value": "{your_public_key_value}",
"createdAt": "2020-01-03T20:30:36.488Z"
}
키 나열:
계정의 공개 키 목록을 가져옵니다.
GET /v1/accounts/{accountID}/keys
하나의 키 받기:
계정의 공개 키에 대한 세부 정보를 가져옵니다.
GET /v1/accounts/{accountID}/keys/{key_Id}
하나의 키 삭제:
계정에서 공개 키를 삭제합니다.
DELETE /v1/accounts/{accountID}/keys/{key_Id}
생성JSON Web Token
게시자는JSON Web Token (JWT) 를 만듭니다. 토큰은 SHA-256 해시 알고리즘 (JWT 사양에서 " RS256“으로 식별됨) 을 사용하여 RSA 알고리즘으로 서명됩니다. 다른 JWT 알고리즘은 지원되지 않습니다.
브라이트코브가 정의한 일부 비공개 소유권 주장과 함께JSON Web Token claims표준의 하위 집합이 사용됩니다. 개인 키로JSON Web Token서명된 을 만듭니다.
정적 URL 전송에 대한 클레임
브라이트코브의 정적 URL 전송에 사용할 수 있는 클레임은 다음과 같습니다.
필드 | 유형 | 필수 | 설명 |
---|---|---|---|
accid |
문자열 | 재생 중인 콘텐츠를 소유한 계정 ID입니다. | |
drules |
문자열 [] | 적용할 배달 규칙 작업 ID 목록입니다. 자세한 내용은배달 규칙 구현을참조하십시오. config_id 쿼리 매개 변수도 설정되어 있으면 이 클레임이 무시되므로 무시됩니다. | |
exp |
정수 | 이 토큰이 더 이상 유효하지 않은 시간 (Epoch 이후 초) 입니다. 30 일을 넘지 않아야합니다. iat |
|
iat |
정수 | 이 토큰이 발행된 시간 (Epoch 이후 초) | |
conid |
문자열 | 이 토큰이 있는 경우 특정 Video Cloud 비디오 ID에 대한 라이선스 가져오기만 승인합니다. 유효한 비디오 ID여야 합니다. |
|
pro |
문자열 | 단일 비디오에 대해 여러 개를 사용할 수 있는 경우 보호 유형을 지정합니다. 값:
|
|
vod |
객체 | 주문형 비디오에 대한 특정 구성 옵션이 포함되어 있습니다. | |
ssai |
문자열 | 서버 측 광고 삽입 (SSAI의) 구성 ID입니다. 이 클레임은 HLS 또는 DASH VMAP을 검색하는데 필요합니다 . |
다음은 사용할 수있는JSON Web Token (JWT) 클레임의 예입니다.
{
// account id: JWT is only valid for this accounts
"accid":"4590388311111",
// drules: list of delivery rule IDs to be applied
"drules": ["0758da1f-e913-4f30-a587-181db8b1e4eb"]
// expires: timestamp when JWT expires
"exp":1577989732,
// issued at: timestamp when the JWT was created
"iat":1575484132,
// content id: JWT is only valid for video id or reference 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"
}
}
토큰 생성
라이브러리는 일반적으로 JWT 토큰을 생성하는 데 사용할 수 있습니다. 자세한 내용은JSON Web Tokens사이트를 참조하십시오.
bash 스크립트의 예:
JWT 토큰을 생성하는 예제 스크립트:
#! /usr/bin/env bash
# Static header fields.
HEADER='{
"type": "JWT",
"alg": "RS256"
}'
payload='{
"pkid": "{your_public_key_id}",
"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 second.
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"
스크립트를 실행합니다.
$ bash jwtgen.sh
사용 예제Go
성과
다음은https://JWT.io을 사용하여 전체 클레임 집합을 지정하는 디코딩된 토큰의 예입니다.
헤더:
{
"alg": "RS256",
"type": "JWT"
}
페이로드:
{
"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"
}
재생 테스트
필수는 아니지만 플레이어를 구성하기 전에 비디오 재생을 테스트할 수 있습니다.
재생 요청:
curl -X GET \
-H 'Authorization: Bearer {JWT}' \
https://edge-auth.api.brightcove.com/playback/v1/accounts/{your_account_id}/videos/{your_video_id}