Tokens de acesso¶
media.access.token
Para novas integrações, use JWT de espectador. Sua aplicação verifica as permissões do espectador e obtém um token de reprodução assinado pela API de administração do central. O reprodutor apresenta esse token ao streamer, que o valida localmente sem consultar sua aplicação ou um backend HTTP de autorização.
Um mesmo JWT funciona em todos os edges do cluster que receberam a chave pública correspondente. Ao mudar para outro edge, o espectador não precisa de um token novo. Esse método de admissão elimina a carga de solicitações de autorização quando muitos espectadores começam a assistir ao mesmo tempo e remove a dependência da admissão de cada espectador em relação à disponibilidade e à latência de um backend HTTP externo.
O backend HTTP de autorização é um mecanismo legado, obsoleto e não recomendado para novas integrações. Ele permanece disponível por compatibilidade.
Como o token é enviado¶
O token pode ser enviado de duas maneiras:
- Parâmetro da URL —
?token=<token>, que tem prioridade. - Cabeçalho —
Authorization: Bearer <token>, usado quando a URL não contém o parâmetrotoken.
Para HLS, abra a playlist mestra com o token: o Sapsan o adiciona às URLs das playlists e dos dados de mídia aninhados. Se usar um cabeçalho, o cliente deve enviá-lo nas solicitações protegidas. Não forneça a chave de administração ao reprodutor: somente sua aplicação precisa dela para emitir JWTs.
Obter um JWT pelo central¶
Primeiro crie um stream chamado news e conecte os streamers ao central. Aguarde a entrega da configuração e das chaves públicas aos edges. O exemplo requer curl e jq; substitua os domínios e a chave de administração pelos seus valores.
CENTRAL_URL='https://central.example.com'
EDGE_1='https://edge1.example.com'
EDGE_2='https://edge2.example.com'
ADMIN_KEY='replace-with-management-api-key'
ISSUED=$(curl --fail-with-body --silent --show-error \
-X POST "$CENTRAL_URL/central/api-v4/play-sessions/grants" \
-H "Authorization: Bearer $ADMIN_KEY" \
-H 'Content-Type: application/json' \
--data '{"streams":["news"],"user_id":"viewer-42","ttl_secs":3600,"max_concurrent":1}')
TOKEN=$(printf '%s' "$ISSUED" | jq -er '.token')
JTI=$(printf '%s' "$ISSUED" | jq -er '.jti')
O central cria uma concessão, um registro do acesso concedido, e retorna 201 Created. Os campos da concessão e token ficam no mesmo nível da resposta. jti identifica a concessão, e expires_at indica quando ela expira, em UTC. O JWT só é retornado na criação; consultar a concessão pela API não retorna o token.
Campos da solicitação:
| Campo | Significado |
|---|---|
streams |
Lista não vazia de nomes exatos de mídia permitidos. Para o stream news, informe news; curingas não são aceitos. |
user_id |
Identificador do espectador no seu sistema. Incluído nas estatísticas da sessão. |
ttl_secs |
Validade em segundos a partir da emissão. O padrão é 14400, ou quatro horas. |
max_concurrent |
Limite de sessões ativas simultâneas desta concessão. Se omitido, é 1; null significa sem limite; 0 é rejeitado. |
bind_ip |
Vinculação opcional a um endereço IP ou CIDR. Sem ela, o token permite a mudança do endereço do cliente. |
note |
Nota opcional para o operador. |
Reprodução e mudança de edge¶
Obtenha a playlist HLS do primeiro edge e depois do segundo usando o mesmo TOKEN:
curl --fail-with-body --silent --show-error \
"$EDGE_1/streaming/v/news/index.m3u8?token=$TOKEN"
curl --fail-with-body --silent --show-error \
"$EDGE_2/streaming/v/news/index.m3u8?token=$TOKEN"
Esses comandos obtêm playlists; para reproduzir o conteúdo, abra a URL correspondente em um reprodutor HLS. Ambos os edges devem poder servir o stream news. A validação do JWT por si só não atribui o stream a uma máquina nem garante a disponibilidade da fonte.
Para que o balanceador escolha o streamer, use https://central.example.com/playback/v/news/index.m3u8?token=<JWT>. A disponibilidade dessa URL também depende do central: ele seleciona um streamer e redireciona a solicitação ou atua como proxy da mídia. Uma URL direta do edge é validada pelo próprio streamer.
Mudar de edge pode criar uma nova sessão local. O central associa as sessões à concessão e considera a atividade para que o edge anterior, que já não recebe solicitações de mídia, não ocupe o limite indefinidamente. Veja sessão do cluster e mudança de edge.
Escopo e validade¶
O listener MoQ ainda não utiliza este mecanismo de autorização.
O JWT é assinado com Ed25519 pelo algoritmo EdDSA; kid no cabeçalho seleciona a chave pública. Seu conteúdo inclui:
jti— identificador da concessão.user_id— identificador do espectador.exp— expiração em segundos Unix.streams— nomes de mídia permitidos.bind_ip— endereço IP ou rede, se a vinculação estiver configurada.
O ao vivo e o arquivo de um stream usam o mesmo nome: news. Para VOD, informe vod/<asset-id>: a concessão cobre os arquivos desse asset independentemente do root de armazenamento e do nome do arquivo. O claim padrão aud não é usado para esse escopo. O limite max_concurrent fica no registro do central, fora do JWT.
O edge verifica localmente a assinatura, a validade e o escopo, além da vinculação a IP, se configurada. Há uma tolerância de 30 segundos para diferenças de relógio. Um JWT inválido é rejeitado sem tentativa de autorização pelo backend HTTP. Após a expiração, as próximas solicitações HTTP são rejeitadas; ampliar o acesso requer uma nova concessão. Não há garantia de interrupção imediata de uma resposta HTTP contínua já aberta; essa limitação está descrita em autorização da sessão. Planeje a renovação do token na aplicação se o espectador puder continuar assistindo depois da expiração.
Limite de sessões e revogação de acesso¶
max_concurrent se aplica à concessão em todo o cluster. O central recebe informações sobre as sessões e encerra de forma assíncrona as sessões ativas mais antigas que excedem o limite; a nova sessão permanece. Isso não rejeita imediatamente a segunda solicitação em cada edge. O limite conta sessões do servidor, não necessariamente dispositivos físicos diferentes: solicitações com a mesma mídia, IP e concessão podem ser agrupadas em uma única sessão HTTP.
Alterar o limite sem reemitir o JWT:
curl --fail-with-body --silent --show-error \
-X PATCH "$CENTRAL_URL/central/api-v4/play-sessions/grants/$JTI" \
-H "Authorization: Bearer $ADMIN_KEY" \
-H 'Content-Type: application/json' \
--data '{"max_concurrent":2}'
Revogar toda a concessão:
curl --fail-with-body --silent --show-error \
-X DELETE "$CENTRAL_URL/central/api-v4/play-sessions/grants/$JTI" \
-H "Authorization: Bearer $ADMIN_KEY"
A revogação retorna 204 No Content. O central a entrega aos streamers por um canal separado de terminações. Ao recebê-la, o streamer fecha as sessões dessa concessão e rejeita novas solicitações. A revogação não é uma verificação global imediata em cada solicitação de mídia: se perder a conexão com o central, o edge não saberá de uma nova revogação até o restabelecimento do canal.
Entrega de chaves e operação sem conexão com o central¶
O central mantém a chave privada de assinatura e entrega as chaves públicas aos streamers em auth.ticket_keys, junto com a configuração. Quando a política não especifica uma lista de chaves, o central insere as próprias chaves automaticamente. Um edge com uma chave pública pode validar JWTs, mas não pode emitir tokens novos.
A validação em um edge já configurado não exige que o central esteja disponível. Enquanto o JWT for válido e a mídia estiver disponível, a admissão local continua usando as chaves recebidas. Estas operações ainda dependem do central:
- Emissão de novas concessões — exige a API do central e seu armazenamento.
- Novas chaves e alterações de política — precisam chegar aos streamers.
- Revogações e limite global de sessões — exigem o canal de terminações e as informações de sessões.
- Balanceamento por
/playback— é realizado pelo central.
Durante a rotação, a chave pública anterior deve continuar disponível para validar os JWTs que ainda forem válidos. Não a remova antes de esses tokens expirarem. O suporte a várias chaves não implica a existência de uma API pública de rotação automática.
Tokens estáticos¶
Os tokens estáticos permanecem disponíveis por compatibilidade e para instalações existentes simples. Eles não substituem a emissão de concessões individuais aos espectadores:
auth:
play_tokens:
- viewer-secret-1
publish_tokens:
- publisher-secret-1
play_tokens— tokens de reprodução.publish_tokens— tokens de publicação.
O JWT de espectador se destina à reprodução; não o use como permissão de publicação. Em um cluster gerenciado, o central entrega a política auth; o YAML acima mostra a estrutura das configurações para um streamer independente.
opaque_tokens é true por padrão para manter a compatibilidade. Após a migração, pode defini-lo como false para desativar o caminho geral de tokens opacos e backends HTTP, incluindo os tokens estáticos da política global. Os tokens de reprodução nas configurações de cada stream continuam funcionando. Um open_playback explícito continua abrindo o acesso à reprodução. Verifique toda a política de acesso durante a migração.