Generare e firmare token di riproduzione IVS
Per informazioni dettagliate su come lavorare con i JWT e le librerie supportate per la firma dei token, visita jwt.io
Schema dei token
Tutti i JWT hanno tre campi: intestazione, payload e firma.
-
L'Intestazione specifica:
-
algè l'algoritmo di firma. Questo è ES384, un algoritmo di firma ECDSA che utilizza l'algoritmo hash SHA-384. -
typè il tipo di token, JWT.
{ "alg": "ES384", "typ": "JWT" } -
-
Il payload contiene dati specifici di Amazon IVS:
-
channel-arnè un riferimento per la richiesta di riproduzione video. -
access-control-allow-originè un campo opzionale che può essere utilizzato per limitare la riproduzione a un'originespecificata, ad esempio per rendere un flusso visualizzabile solo da un sito Web specificato. Ad esempio, è possibile che tu voglia impedire alle persone di incorporare il lettore su altri siti web. Per impostazione predefinita, la riproduzione è consentita su tutte le origini. Ciò limita solo il client del browser; non limita la riproduzione da parte di un client non browser. Questo campo può contenere più origini separate da virgole. Sono consentiti domini jolly: ogni origine può iniziare il proprio nome host con * (esempio: https://*.amazon.com). Se strict-origin-enforcementètrue, è possibile specificare al massimo 5 domini; in caso contrario, non è previsto un massimo. -
strict-origin-enforcementè un campo opzionale che può essere utilizzato per rafforzare la restrizione di origine specificata nel campoaccess-control-allow-origin. Per impostazione predefinita, la restrizioneaccess-control-allow-originsi applica solo alla playlist multivariante. Se l'opzionestrict-origin-enforcementè abilitata, il server applicherà un requisito in base al quale l'origine richiedente deve corrispondere al token per tutte le richieste di riproduzione (incluse playlist multivarianti, playlist di varianti e segmenti). Ciò implica che tutti i client (inclusi client non browser) dovranno fornire un'intestazione di richiesta di origine valida per ogni richiesta. Usa il metodosetOriginper impostare l'intestazione negli SDK di iOS Player e Android Player di IVS. Viene impostato automaticamente nei browser web, ad eccezione di iOS Safari. Per iOS Safari, devi aggiungerecrossorigin="anonymous"all'elemento video per accertarti che l'intestazione della richiesta di origine venga inviata. Esempio:<video crossorigin="anonymous"></video>. -
single-use-uuidè un campo facoltativo che contiene un identificatore univoco universale (UUID)valido generato durante la creazione del token. Se aggiungi questo campo e un valore UUID, il token associato generato viene invalidato una volta utilizzato per recuperare una playlist multivariante e guardare un contenuto in streaming. I token di autenticazione monouso rendono più difficile per gli utenti malintenzionati condividere un contenuto in streaming sui tuoi canali privati con altri spettatori. Tieni presente che quando utilizzi la richiesta single-use-uuid, il valore massimo per la richiestaexpè di 10 minuti nel futuro. -
viewer-idè un campo opzionale che contiene un ID utilizzato per il tracciamento e che fa riferimento allo spettatore a cui è concesso il token. Questo campo è necessario per abilitare la possibilità di revocare la sessione di visualizzazione dello spettatore in futuro. La lunghezza massima è di 40 caratteri e il valore deve classificarsi come stringa. Non utilizzare questo campo per informazioni di identificazione personale, riservate o sensibili. Tieni presente che quando utilizziviewer-id, il valore massimo perexpè di 10 minuti nel futuro. -
viewer-session-versionè un campo opzionale che contiene una versione da associare a questa sessione dello spettatore. Quando si revocano le sessioni dello spettatore, questo valore può essere utilizzato per filtrare quali sessioni dello spettatore vengono revocate. Ad esempio, specificare un timestamp Unix qui consentirebbe la revoca di tutte le sessioni avviate prima dell'ora specificata. Il valore deve essere un numero intero con segno a 64 bit (Int64). Questo campo è pensato per essere fornito (facoltativamente) insieme aviewer-id; da solo non ha alcuna funzione. Il valore predefinito è 0. -
maximum-resolutionconsente di specificare il filtro del manifesto in base alla risoluzione per una sessione di visualizzazione, in base ai diritti del visualizzatore. Ad esempio, impostare questo campo suHDsignifica che lo spettatore riceverà una risoluzione inferiore o uguale aHD. -
expè un timestamp Unix UTC che specifica quando scade il token. Questo non indica il periodo di tempo in cui il flusso può essere visualizzato. Il token viene convalidato quando lo spettatore inizializza la riproduzione, non durante tutto il flusso. Inserisci questo valore come valore di tipo intero.Tenere presente che un timestamp Unix è un valore numerico che rappresenta il numero di secondi da 1970-01-01T00:00:00Z UTC fino alla data/ora UTC specificata, ignorando i secondi intercalari. Linguaggi diversi misurano i timestamp di Unix in unità diverse; ad esempio,
Date.now()di JavaScript restituisce il tempo in millisecondi. (Consultaexpnella Sezione JWT RFC 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>", "aws:maximum-resolution": "SD" | "HD" | "FULL_HD", "exp": <unix timestamp> } -
-
Per creare la firma, utilizza la chiave privata con l'algoritmo specificato nell'intestazione (ES384) per firmare l'intestazione codificata e il payload codificato.
ECDSASHA384( base64UrlEncode(header) + "." + base64UrlEncode(payload), <private-key> )
Istruzioni
-
Genera la firma del token con l'algoritmo di firma ES384 e una chiave privata associata a una delle risorse della chiave di riproduzione (consulta l'esempio
ECDSASHA384sopra). -
Assemblare il token.
base64UrlEncode(header) + "." + base64UrlEncode(payload) + "." + base64UrlEncode(signature) -
Aggiungere il token firmato all'URL di riproduzione come parametro di query.
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>
Esempio di Node.js
Di seguito è riportato un modo per generare un token sul back-end (tramite un microservizio o un'applicazione serverless) usando 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; }
Nell'applicazione frontend, è possibile recuperare questo token e accodarlo all'URL di riproduzione del canale privato, come illustrato di seguito.
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();