View a markdown version of this page

Passaggio 3: Distribuisci i token - Amazon IVS

Passaggio 3: Distribuisci i token

Ora che hai una fase, crea e distribuisci i token che i client usano per parteciparvi. Ogni client ha bisogno di un token di partecipazione per partecipare a una fase e inviare o ricevere video. Le applicazioni che utilizzano una RealTimeConnection hanno bisogno anche di un token di connessione.

Un token partecipante autorizza un partecipante a partecipare a una fase specifica e definisce le funzionalità di pubblicazione e iscrizione di tale partecipante. Un token di connessione autorizza una connessione di rete condivisa che un client può riutilizzare nel passaggio da una fase all’altra nello stesso account AWS e nella stessa regione. Un token di connessione non sostituisce un token partecipante. Il client ha bisogno di un token partecipante per ogni fase a cui partecipa.

Esistono due metodi per generare i token:

Entrambi gli approcci sono descritti di seguito.

Creazione di token con una coppia di chiavi

Puoi creare token partecipanti e token di connessione nella tua applicazione server firmando JWT con una coppia di chiavi pubblica/privata ECDSA. Importa la chiave pubblica in IVS in modo che IVS possa verificare la firma JWT quando un client si connette.

Importante

IVS non offre opzioni di scadenza delle chiavi. Se la chiave privata è compromessa, è necessario eliminare la vecchia chiave pubblica.

Creazione di una nuova coppia di chiavi

Esistono vari metodi per creare una coppia di chiavi. Di seguito, forniamo due esempi.

Per creare una nuova coppia di chiavi nella console, completa la seguente procedura:

  1. Apri la console Amazon IVS. Scegli la regione della fase, se non sei già al suo interno.

  2. Nel menu di navigazione a sinistra, scegli Streaming in tempo reale > Chiavi pubbliche.

  3. Scegli Crea chiave pubblica. Verrà visualizzata la finestra di dialogo Crea una chiave pubblica.

  4. Segui le istruzioni e scegli Crea.

  5. Amazon IVS genera una nuova coppia di chiavi. La chiave pubblica viene importata come risorsa di chiave pubblica e la chiave privata viene immediatamente resa disponibile per il download. La chiave pubblica può essere scaricata anche in un secondo momento, se necessario.

    Amazon IVS genera la chiave sul lato client e non archivia la chiave privata. Assicurati di salvare la chiave; non potrai recuperarla in un secondo momento.

Per creare una nuova coppia di chiavi EC P384 con OpenSSL (prima potrebbe essere necessario installare OpenSSL), completa la seguente procedura. Questo processo consente di accedere sia alla chiave privata che a quella pubblica. La chiave pubblica è necessaria solo se desideri testare la verifica dei token.

openssl ecparam -name secp384r1 -genkey -noout -out priv.pem openssl ec -in priv.pem -pubout -out public.pem

Ora importa la nuova chiave pubblica utilizzando le istruzioni riportate di seguito.

Importazione della chiave pubblica

Quando disponi di una coppia di chiavi, puoi importare la chiave pubblica in IVS. La chiave privata non è necessaria per il nostro sistema, ma viene utilizzata dall'utente per firmare i token.

Per importare una chiave pubblica esistente con la console:

  1. Apri la console Amazon IVS. Scegli la regione della fase, se non sei già al suo interno.

  2. Nel menu di navigazione a sinistra, scegli Streaming in tempo reale > Chiavi pubbliche.

  3. Scegli Importa. Verrà visualizzata una finestra di dialogo Importa una chiave pubblica.

  4. Segui le istruzioni e scegli Importa.

  5. Amazon IVS importa la chiave pubblica e genera una risorsa di chiave pubblica.

Per importare una chiave pubblica esistente con la CLI:

aws ivs-realtime import-public-key --public-key-material "`cat public.pem`" --region <aws-region>

Puoi omettere --region <aws-region> se la regione è nel tuo file di configurazione AWS locale.

Di seguito è riportata una risposta di esempio:

{ "publicKey": { "arn": "arn:aws:ivs:us-west-2:123456789012:public-key/f99cde61-c2b0-4df3-8941-ca7d38acca1a", "fingerprint": "98:0d:1a:a0:19:96:1e:ea:0a:0a:2c:9a:42:19:2b:e7", "publicKeyMaterial": "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEVjYMV+P4ML6xemanCrtse/FDwsNnpYmS\nS6vRV9Wx37mjwi02hObKuCJqpj7x0lpz0bHm5v1JBvdZYAd/r2LR5aChK+/GM2Wj\nl8MG9NJIVFaw1u3bvjEjzTASSfS1BDX1\n-----END PUBLIC KEY-----\n", "tags": {} } }

Richiesta API

POST /ImportPublicKey HTTP/1.1 { "publicKeyMaterial": "<pem file contents>" }

Token partecipanti

Un token partecipante autorizza un partecipante a partecipare a una fase. Contiene l’ARN e l’ID della fase, gli endpoint, gli attributi opzionali dei partecipanti e le funzionalità di pubblicazione e iscrizione.

Crea dei token partecipante con una coppia di chiavi

Per informazioni dettagliate su come lavorare con i JWT e le librerie supportate per la firma dei token, visita jwt.io. Nell'interfaccia jwt.io, per firmare i token devi inserire la tua chiave privata. La chiave pubblica è necessaria solo se desideri verificare i token.

Tutti i JWT hanno tre campi: intestazione, payload e firma.

Gli schemi JSON per l’intestazione e il payload di JWT sono descritti di seguito. In alternativa, è possibile copiare un JSON di esempio dalla console IVS. Per ottenere l'intestazione e il payload JSON dalla console IVS:

  1. Apri la console Amazon IVS. Scegli la regione della fase, se non sei già al suo interno.

  2. Nel menu di navigazione a sinistra, scegli Streaming in tempo reale > Fasi.

  3. Seleziona la fase da utilizzare. Seleziona Visualizza dettagli.

  4. Nella sezione Token del partecipante, seleziona il menu a discesa accanto a Crea token.

  5. Seleziona Crea intestazione e payload del token.

  6. Compila il modulo e copia l'intestazione e il payload JWT mostrati nella parte inferiore del popup.

Schema dei token: intestazione

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.

  • kid è l'ARN della chiave pubblica utilizzata per firmare il token. Deve essere lo stesso ARN restituito dalla richiesta API GetPublicKey.

{ "alg": "ES384", "typ": "JWT" "kid": "arn:aws:ivs:123456789012:us-east-1:public-key/abcdefg12345" }

Schema dei token: payload

Il payload contiene dati specifici di IVS. Tutti i campi tranne user_id sono obbligatori.

  • RegisteredClaims nelle specifiche JWT sono affermazioni riservate che devono essere fornite affinché il token della fase sia valido:

    • exp (ora di scadenza) è un timestamp Unix UTC che specifica quando scade il token. Un timestamp Unix è un valore numerico che rappresenta il numero di secondi a partire da 1970-01-01T00:00:00Z UTC fino alla data/ora UTC specificata, ignorando i secondi intercalari. Il token viene convalidato quando il partecipante si aggiunge a una fase. IVS fornisce token con un TTL predefinito di 12 ore, che consigliamo; questo valore può essere esteso fino a un massimo di 14 giorni dall'ora di emissione (iat). Questo valore deve essere un numero intero.

    • iat (ora di emissione) è un timestamp Unix UTC che specifica quando è stato emesso il JWT. Vedi la nota relativa a exp sui timestamp Unix. Questo valore deve essere un numero intero.

    • jti (JWT ID) è l'ID del partecipante utilizzato per il tracciamento e fa riferimento al partecipante a cui è concesso il token. Ogni token deve avere un ID partecipante univoco. Deve essere una stringa con distinzione tra maiuscole e minuscole, lunga fino a 64 caratteri, contenente solo caratteri alfanumerici, trattino (-) e trattino basso (_). Non sono ammessi altri caratteri speciali.

  • user_id è un nome opzionale assegnato dal cliente per facilitare l’identificazione del token; può essere utilizzato per collegare un partecipante a un utente nei sistemi del cliente. Deve corrispondere al campo userId nella richiesta API CreateParticipantToken. Può essere qualsiasi testo codificato in UTF-8 ed è una stringa di massimo 128 caratteri. Questo campo è visibile a tutti i partecipanti della fase. Non deve essere utilizzato per informazioni di identificazione, riservate o sensibili.

  • resource è l’ARN della fase; ad esempio, arn:aws:ivs:us-east-1:123456789012:stage/oRmLNwuCeMlQ.

  • topic è l'ID della fase, che può essere dedotto dall'ARN della fase. Ad esempio, se l'ARN della fase è arn:aws:ivs:us-east-1:123456789012:stage/oRmLNwuCeMlQ, l'ID della fase è oRmLNwuCeMlQ.

  • events_url deve essere l'endpoint degli eventi restituito dall'operazione CreateStage o GetStage. Si consiglia di memorizzare questo valore nella cache al momento della creazione della fase; il valore può essere memorizzato nella cache per un massimo di 14 giorni. Un valore di esempio è wss://global.events.live-video.net.

  • whip_url deve essere l'endpoint WHIP restituito dall'operazione CreateStage o GetStage. Si consiglia di memorizzare questo valore nella cache al momento della creazione della fase; il valore può essere memorizzato nella cache per un massimo di 14 giorni. Un valore di esempio è https://453fdfd2ad24df.global-bm.whip.live-video.net.

  • capabilities specifica le funzionalità del token; i valori validi sono allow_publish e allow_subscribe. Per i token riservati ai soli abbonati, imposta soltanto allow_subscribe su true.

  • attributes è un campo opzionale in cui è possibile specificare gli attributi forniti dall'applicazione da codificare nel token e collegarli a una fase. Le chiavi e i valori delle mappe possono contenere testo codificato in UTF-8. La lunghezza massima di questo campo è 1 KB in totale. Questo campo è visibile a tutti i partecipanti della fase. Non deve essere utilizzato per informazioni di identificazione, riservate o sensibili.

  • version deve essere 1.0.

    { "exp": 1697322063, "iat": 1697149263, "jti": "Mx6clRRHODPy", "user_id": "<optional_customer_assigned_name>", "resource": "<stage_arn>", "topic": "<stage_id>", "events_url": "wss://global.events.live-video.net", "whip_url": "https://114ddfabadaf.global-bm.whip.live-video.net", "capabilities": { "allow_publish": true, "allow_subscribe": true }, "attributes": { "optional_field_1": "abcd1234", "optional_field_2": "false" }, "version": "1.0" }

Schema dei token: firma

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

  1. Genera la firma del token con un algoritmo di firma ES384 e una chiave privata associata alla chiave pubblica fornita a IVS.

  2. Assemblare il token.

    base64UrlEncode(header) + "." + base64UrlEncode(payload) + "." + base64UrlEncode(signature)

Creazione di token con l'API di streaming in tempo reale di IVS

Distribuzione dei token ai partecipanti: flusso di lavoro dei token della fase

Come mostrato sopra, un’applicazione client richiede un token all’applicazione server e l’applicazione server chiama CreateParticipantToken utilizzando un SDK AWS o una richiesta firmata SigV4. Poiché le credenziali AWS vengono utilizzate per chiamare l'API, il token deve essere generato in un'applicazione sicura lato server, non nell'applicazione lato client.

Quando si crea un token del partecipante, è possibile specificare attributi e/o funzionalità:

  • È possibile specificare gli attributi forniti dall'applicazione da codificare nel token e collegarli a una fase. Le chiavi e i valori delle mappe possono contenere testo codificato in UTF-8. La lunghezza massima di questo campo è 1 KB in totale. Questo campo è visibile a tutti i partecipanti della fase. Non deve essere utilizzato per informazioni di identificazione, riservate o sensibili.

  • È possibile specificare le funzionalità abilitate dal token. L'opzione predefinita è PUBLISH e SUBSCRIBE, che consente al partecipante di inviare e ricevere audio e video, ma è possibile emettere token con un sottoinsieme di funzionalità. Ad esempio, puoi emettere un token con la sola capacità SUBSCRIBE per i moderatori. In tal caso, i moderatori potrebbero vedere i partecipanti che inviano video ma non inviare a loro volta un video.

Per i dettagli, consulta CreateParticipantToken.

Puoi creare token per i partecipanti tramite la console o l’interfaccia a riga di comando per test e sviluppo, ma molto probabilmente vorrai crearli con l’SDK AWS nel tuo ambiente di produzione.

Avrai bisogno di un modo per distribuire i token dal server a ciascun client (ad esempio, tramite una richiesta API). Questa funzionalità non è disponibile. Per questa guida, puoi semplicemente copiare e incollare i token nel codice cliente come riportato nei seguenti passaggi.

Importante: tratta i token come opachi; non creare funzionalità basate sul contenuto dei token. Il formato dei token potrebbe cambiare in futuro.

Istruzioni per la console

  1. Passa alla fase che hai creato nel passaggio precedente.

  2. Seleziona Crea token. Viene visualizzata la finestra Crea token.

  3. Inserisci un ID utente da associare al token. Può essere qualsiasi testo codificato in UTF-8.

  4. Seleziona Crea.

  5. Copiare il token. Importante: assicurati di salvare il token; IVS non lo memorizza e non potrai recuperarlo in seguito.

Istruzioni per la CLI

La creazione di un token con AWS CLI richiede prima il download e la configurazione della CLI sul computer. Per maggiori dettagli, consulta la Guida per l'utente dell'interfaccia a riga di comando di AWS. Nota: la generazione di token con AWS CLI è utile per scopi di test, ma per l’uso in produzione si consiglia di generare token sul lato server con l’SDK AWS (vedere le istruzioni di seguito).

  1. Esegui il comando create-participant-token con l'ARN della fase. Includi una o tutte le funzionalità seguenti: "PUBLISH""SUBSCRIBE".

    aws ivs-realtime create-participant-token --stage-arn arn:aws:ivs:us-west-2:123456789012:stage/VSWjvX5XOkU3 --capabilities '["PUBLISH", "SUBSCRIBE"]'
  2. Questa operazione restituisce un token del partecipante:

    { "participantToken": { "capabilities": [ "PUBLISH", "SUBSCRIBE" ], "expirationTime": "2023-06-03T07:04:31+00:00", "participantId": "tU06DT5jCJeb", "token": "eyJhbGciOiJLTVMiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NjE1NDE0MjAsImp0aSI6ImpGcFdtdmVFTm9sUyIsInJlc291cmNlIjoiYXJuOmF3czppdnM6dXMtd2VzdC0yOjM3NjY2NjEyMTg1NDpzdGFnZS9NbzhPUWJ0RGpSIiwiZXZlbnRzX3VybCI6IndzczovL3VzLXdlc3QtMi5ldmVudHMubGl2ZS12aWRlby5uZXQiLCJ3aGlwX3VybCI6Imh0dHBzOi8vNjZmNzY1YWM4Mzc3Lmdsb2JhbC53aGlwLmxpdmUtdmlkZW8ubmV0IiwiY2FwYWJpbGl0aWVzIjp7ImFsbG93X3B1Ymxpc2giOnRydWUsImFsbG93X3N1YnNjcmliZSI6dHJ1ZX19.MGQCMGm9affqE3B2MAb_DSpEm0XEv25hfNNhYn5Um4U37FTpmdc3QzQKTKGF90swHqVrDgIwcHHHIDY3c9eanHyQmcKskR1hobD0Q9QK_GQETMQS54S-TaKjllW9Qac6c5xBrdAk" } }
  3. Salvare questo token. Ti servirà per unirti alla fase e inviare e ricevere video.

AWSIstruzioni per gli SDK 

Per creare i token, è possibile utilizzare l'SDK AWS. Di seguito sono riportate le istruzioni per l'SDK AWS che utilizza JavaScript.

Importante: questo codice deve essere eseguito sul lato server e il relativo output passato al client.

Prerequisito: per utilizzare l'esempio di codice riportato di seguito, è necessario installare il pacchetto aws-sdk/client-ivs-realtime. Per informazioni dettagliate, consulta Nozioni di base sull’SDK AWS per JavaScript.

import { IVSRealTimeClient, CreateParticipantTokenCommand } from "@aws-sdk/client-ivs-realtime"; const ivsRealtimeClient = new IVSRealTimeClient({ region: 'us-west-2' }); const stageArn = 'arn:aws:ivs:us-west-2:123456789012:stage/VSWjvX5XOkU3'; const createStageTokenRequest = new CreateParticipantTokenCommand({ stageArn, }); const response = await ivsRealtimeClient.send(createStageTokenRequest); console.log('token', response.participantToken.token);

Token di connessione

Un token di connessione è un JWT autofirmato che autorizza una connessione di rete condivisa. Un client può riutilizzare questa connessione mentre passa da una fase all’altra nello stesso account AWS e nella stessa regione, fino alla scadenza del token.

Crea e firma i token di connessione sul tuo server con la coppia di chiavi creata in precedenza. Invia il token di connessione al client prima che inizi un flusso di lavoro che passi da una fase all’altra. Il client crea una RealTimeConnection e la fornisce ogni volta che crea una fase. Il client utilizza quindi il token partecipante appropriato per ogni fase a cui partecipa.

Intestazione del token

Usa l’intestazione del token descritta in Crea token partecipanti con una coppia di chiavi.

Payload del token

{ "exp": 1697322063, "iat": 1697149263, "jti": "Mx6clRRHODPy", "account_id": "123456789012", "region": "us-west-2", "events_url": "wss://global.events.live-video.net", "version": "1.0" }

Il payload contiene dati specifici di IVS. Tutti i campi sono obbligatori:

  • RegisteredClaims nelle specifiche JWT sono affermazioni riservate che devono essere presenti affinché il token sia valido:

    • exp (ora di scadenza) è un timestamp Unix UTC che specifica quando scade il token. Un token può scadere fino a quattro settimane dopo la sua creazione.

    • iat (ora di emissione) è un timestamp Unix UTC che specifica quando è stato emesso il JWT.

    • jti (ID JWT) è un ID token univoco. Genera un nuovo ID con distinzione tra maiuscole e minuscole per ogni token di connessione. L’ID può contenere fino a 64 caratteri alfanumerici, trattini (-) e trattini bassi (_).

  • account_id è l’ID dell’account AWS che possiede le fasi.

  • region è la regione di origine della chiave pubblica di IVS utilizzata per firmare il token.

  • events_url deve essere wss://global.events.live-video.net.

  • version deve essere 1.0.

Un token di connessione non contiene l’ARN della fase, l’ID della fase, l’endpoint WHIP, le funzionalità dei partecipanti, gli attributi dei partecipanti o l’ID utente. Questi valori appartengono al token partecipante per la fase a cui il client partecipa.

Firma il token come descritto in Crea dei token partecipante con una coppia di chiavi, utilizzando l’intestazione del token di connessione e il payload sopra riportati.