Gerar e assinar tokens de reprodução do IVS
Para obter detalhes sobre como trabalhar com JWTs e as bibliotecas suportadas para assinar tokens, visite jwt.io
Esquema de token
Todos os JWTs têm três campos: cabeçalho, carga útil e assinatura.
-
O cabeçalho especifica:
-
alg
é o algoritmo de assinatura. Este é o ES384, um algoritmo de assinatura ECDSA que usa o algoritmo de hash SHA-384. -
typ
é o tipo de token, JWT.
{ "alg": "ES384", "typ": "JWT" }
-
-
A carga útil contém dados específicos do Amazon IVS:
-
channel-arn
é uma referência para a solicitação de reprodução de vídeo. -
access-control-allow-origin
é um campo opcional que pode ser usado para restringir a reprodução a uma origemespecificada, isto é, para tornar uma transmissão visível em apenas um site especificado. Por exemplo, talvez você queira impedir que as pessoas incorporem o player em outros sites. Por padrão, a reprodução é permitida em todas as origens. (Observe que isso restringe apenas o cliente do navegador; isso não restringe a reprodução de um cliente que não seja do navegador.) Esse campo pode conter várias origens, separando-se por vírgulas. Domínios curinga são permitidos: cada origem pode começar seu nome de host com * (exemplo: https://*.amazon.com). Se strict-origin-enforcement
fortrue
, no máximo 5 domínios podem ser especificados; caso contrário, não há máximo. -
strict-origin-enforcement
é um campo opcional que pode ser usado para fortalecer a restrição de origem especificada no campoaccess-control-allow-origin
. Por padrão, a restriçãoaccess-control-allow-origin
se aplica somente à lista de reprodução multivariante. Sestrict-origin-enforcement
estiver habilitado, o servidor exigirá que a origem da solicitação corresponda ao token para todas as solicitações de reprodução (incluindo lista de reprodução multivariante, lista de reprodução variante e segmentos). Isso significa que todos os clientes (incluindo clientes que não são navegadores) precisarão fornecer um cabeçalho de solicitação de origem válido com cada solicitação. Use o métodosetOrigin
para definir o cabeçalho nos SDKs dos reprodutores IVS para iOS e Android. Ele é definido automaticamente em navegadores da Web, exceto o iOS Safari. Para o iOS Safari, você precisa adicionarcrossorigin="anonymous"
ao elemento de vídeo para garantir que o cabeçalho da solicitação de origem seja enviado. Exemplo:<video crossorigin="anonymous"></video>
. -
single-use-uuid
é um campo opcional que contém um identificador universal exclusivo (UUID)válido que você gera como parte da criação do token. Se você adicionar esse campo e um valor de UUID, o token associado gerado será invalidado quando for usado para buscar uma lista de reprodução multivariada e assistir a uma transmissão. Os tokens de autenticação de uso único dificultam para usuários mal-intencionados compartilharem uma transmissão em seus canais privados com outros visualizadores. Observe que ao usar a reivindicação single-use-uuid
, o valor máximo para a reivindicaçãoexp
é de dez minutos no futuro. -
viewer-id
é um campo opcional que contém uma ID usada para rastrear e fazer referência ao visualizador a quem o token foi concedido. Este campo é necessário para habilitar a capacidade de revogar a sessão de visualização do visualizador no futuro. O tamanho máximo é de 40 caracteres e o valor deve ser qualificado como uma string. Não use este campo para identificação pessoal, informações confidenciais ou sigilosas. Observe que ao usar oviewer-id
, o valor máximo paraexp
é de dez minutos no futuro. -
viewer-session-version
é um campo opcional que contém uma versão a ser associada a esta sessão do visualizador. Ao revogar sessões do visualizador, este valor pode ser usado para filtrar quais sessões do visualizador serão revogadas. Por exemplo, especificar um timestamp Unix aqui permitiria a revogação de todas as sessões iniciadas antes do horário especificado. O valor deve ser um número inteiro assinado de 64 bits (Int64). Este campo deve ser fornecido (opcionalmente) junto com oviewer-id
; ele não faz nada sozinho. O valor padrão é 0. -
exp
é um timestamp UTC do Unix para o momento em que o token expirar. Isso não indica o período em que o stream pode ser visualizado. O token é validado quando o visualizador inicializa a reprodução, não em todo o stream. Insira esse valor como um valor de tipo inteiro.Observe que um timestamp Unix corresponde a um valor numérico que representa o número de segundos de 1970-01-01T00:00:00Z UTC até a data/hora UTC especificada, ignorando os segundos bissextos. Linguagens diferentes medem timestamps Unix em unidades diferentes; por exemplo,
Date.now()
do JavaScript retorna a hora em milissegundos. (Consulteexp
na JWT RFC section 4.1.4.)
{ "aws:channel-arn": "<channel_arn>", "aws:access-control-allow-origin": "<your-origin>", "aws:strict-origin-enforcement": true, "aws:single-use-uuid": "<UUID>", "aws:viewer-id": "<viewer_id>", "aws:viewer-session-version": "<viewer_session_version>", "exp": <unix timestamp> }
-
-
Para criar a assinatura, use a chave privada com o algoritmo especificado no cabeçalho (ES384) para assinar o cabeçalho codificado e a carga útil codificada.
ECDSASHA384( base64UrlEncode(header) + "." + base64UrlEncode(payload), <private-key> )
Instruções
-
Gere a assinatura do token com o algoritmo de assinatura ES384 e uma chave privada que é associada a um de seus recursos de chave de reprodução (consulte o exemplo
ECDSASHA384
acima). -
Monte o token.
base64UrlEncode(header) + "." + base64UrlEncode(payload) + "." + base64UrlEncode(signature)
-
Acrescente o token assinado ao URL de reprodução como um parâmetro de consulta.
https://b37c565f6d790a14a0e78afaa6808a80.us-west-2.playback.live-video.net/ api/video/v1/aws.ivs.us-west-2.123456789. channel.fbc789c1-2c56-4ce6-a30a-d99275dc4481.m3u8?token=<token>
Exemplo de Node.js
Abaixo está uma forma de gerar um token no back-end (por meio de um microsserviço ou aplicação com tecnologia sem servidor) usando o Node.js.
import jwt from "jsonwebtoken"; const getToken = () => { const privateChannelArn = process.env.DEMO_PRIVATE_CHANNEL_ARN; // private channel ARN const privateChannelPrivateKey = process.env.DEMO_PRIVATE_CHANNEL_PRIVATE_KEY; // playback private key const payload = { "aws:channel-arn": privateChannelArn, "aws:access-control-allow-origin": "*", "exp": Date.now() + (60 * 1000), // expires in 1 minute }; const token = jwt.sign(payload, privateChannelPrivateKey, { algorithm: 'ES384' }); return token; }
Em sua aplicação de frontend, você pode recuperar esse token e anexá-lo à URL de reprodução do canal privado, conforme mostrado abaixo.
const streamUrl = `https://b37c565f6d790a14a0e78afaa6808a80.us-west-2.playback.live-video.net/api/video/v1/aws.ivs.us-west-2.123456789.channel.fbc789c1-2c56-4ce6-a30a-d99275dc4481.m3u8?token.m3u8?token=${token}` const ivsPlayer = IVSPlayer.create(); ivsPlayer.attachHTMLVideoElement(document.getElementById('video-player')); ivsPlayer.load(streamUrl); ivsPlayer.play();