Étape 3 : distribuer les jetons
Maintenant que vous disposez d’une scène, créez et distribuez les jetons que les clients utilisent pour la rejoindre. Chaque client a besoin d’un jeton de participant pour rejoindre une scène et envoyer ou recevoir une vidéo. Les applications qui utilisent une RealTimeConnection ont également besoin d’un jeton de connexion.
Un jeton de participant autorise un participant à rejoindre une scène spécifique et définit ses capacités de publication et d’abonnement. Un jeton de connexion autorise une connexion réseau partagée qu’un client peut réutiliser lorsqu’il passe d’une scène à l’autre dans le même compte et la même Région AWS. Un jeton de connexion ne remplace pas un jeton de participant. Le client a besoin d’un jeton de participant pour chaque scène qu’il rejoint.
Il existe deux méthodes pour générer des jetons :
Les deux méthodes sont décrites ci-dessous.
Création de jetons à l’aide d’une paire de clés
Vous pouvez créer des jetons de participant et des jetons de connexion dans votre application serveur en signant des JWT avec une paire de clés ECDSA publique/privée. Importez la clé publique dans IVS afin qu’IVS puisse vérifier la signature du JWT lorsqu’un client se connecte.
Important
IVS ne propose pas d’expiration des clés. En cas de compromission de votre clé privée, vous devrez supprimer l’ancienne clé publique.
Création d’une nouvelle paire de clés
Il existe différentes méthodes pour créer une paire de clés. Ci-dessous, nous en donnons deux exemples.
Pour créer une paire de clés dans la console, procédez comme suit :
-
Ouvrez la console Amazon IVS
. Choisissez la région de votre scène si vous ne l’avez pas déjà sélectionnée. -
Dans le menu de navigation de gauche, sélectionnez Diffusion en temps réel > Clés publiques.
-
Choisissez Créer une clé publique. Une boîte de dialogue Créer une clé publique s’affiche.
-
Suivez les instructions et sélectionnez Create (Créer).
-
Amazon IVS génère une nouvelle paire de clés. La clé publique est importée comme ressource et la clé privée est immédiatement téléchargeable. La clé publique peut être téléchargée ultérieurement si nécessaire.
Amazon IVS génère la clé côté client et ne stocke pas la clé privée. Assurez-vous d'enregistrer la clé ; vous ne pourrez pas la récupérer ultérieurement.
Pour créer une nouvelle paire de clés EC P384 avec OpenSSL (vous devrez peut-être d’abord installer OpenSSL
openssl ecparam -name secp384r1 -genkey -noout -out priv.pem openssl ec -in priv.pem -pubout -out public.pem
Importez à présent votre nouvelle clé publique à l'aide des instructions suivantes.
Importation de la clé publique
Une fois la paire de clés créée, vous pouvez importer la clé publique dans IVS. Notre système n'a pas besoin de la clé privée, mais vous l'utilisez pour signer des jetons.
Pour importer une clé publique existante avec la console :
-
Ouvrez la console Amazon IVS
. Choisissez la région de votre scène si vous ne l’avez pas déjà sélectionnée. -
Dans le menu de navigation de gauche, sélectionnez Diffusion en temps réel > Clés publiques.
-
Choisissez Importer. Une boîte de dialogue Importer une clé publique s’affiche.
-
Suivez les instructions et sélectionnez Import (Importer).
-
Amazon IVS importe votre clé publique et génère une ressource clé publique.
Pour importer une clé publique existante avec la CLI :
aws ivs-realtime import-public-key --public-key-material "`cat public.pem`" --region <aws-region>
Vous pouvez omettre --region <aws-region> si la région figure dans votre fichier de configuration AWS local.
Voici un exemple de réponse :
{ "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": {} } }
Requête d’API
POST /ImportPublicKey HTTP/1.1 { "publicKeyMaterial": "<pem file contents>" }
Jetons de participant
Un jeton de participant autorise un participant à rejoindre une scène. Il contient l’ARN et l’ID de la scène, les points de terminaison, les attributs facultatifs du participant ainsi que les capacités de publication et d’abonnement.
Créer des jetons de participant avec une paire de clés
Pour plus d’informations sur l’utilisation des JWT et des bibliothèques prises en charge pour la signature de jetons, consultez la page jwt.io
Tous les JWT présentent trois champs : header (en-tête), payload (charge utile) et signature.
Les schémas JSON de l’en-tête et des données utiles du JWT sont décrits ci-dessous. Vous pouvez également copier un modèle JSON depuis la console IVS. Pour obtenir l’en-tête et les données utiles JSON depuis la console IVS :
-
Ouvrez la console Amazon IVS
. Choisissez la région de votre scène si vous ne l’avez pas déjà sélectionnée. -
Dans le menu de navigation à gauche, choisissez Diffusion en temps réel > Scènes.
-
Sélectionnez la scène que vous souhaitez utiliser. Sélectionnez Voir les détails.
-
Dans la section Jetons de participant, déroulez le menu à côté de Créer un jeton.
-
Sélectionnez Créer l’en-tête et les données utiles du jeton.
-
Remplissez le formulaire et copiez l’en-tête et les données utiles du jeton JWT affichés en bas de la fenêtre.
Schéma du jeton : en-tête
header spécifie :
-
algest l'algorithme de signature. Il s’agit d’ES384, un algorithme de signature ECDSA qui utilise l’algorithme de hachage SHA-384. -
typest le type de jeton, JWT. -
kidest l’ARN de la clé publique utilisée pour signer le jeton. Il doit s’agir du même ARN que celui renvoyé par la requête API GetPublicKey.
{ "alg": "ES384", "typ": "JWT" "kid": "arn:aws:ivs:123456789012:us-east-1:public-key/abcdefg12345" }
Schéma du jeton : données utiles
Les données utiles contiennent des données spécifiques à IVS. Tous les champs sauf user_id sont obligatoires.
-
RegisteredClaimsdans la spécification JWT sont des revendications réservées qui doivent être fournies pour que le jeton de scène soit valide :-
exp(heure d’expiration) est un horodatage Unix UTC indiquant le moment où le jeton expire. (Le horodatage Unix est une valeur numérique représentant le nombre de secondes entre le 1970-01-01T00:00:00Z UTC et la date/heure UTC spécifiée, sans tenir compte des secondes intercalaires.) Le jeton est validé lorsque le participant rejoint une scène. IVS fournit des jetons avec un TTL par défaut de 12 heures, ce que nous recommandons ; ce délai peut être prolongé jusqu’à un maximum de 14 jours à compter de la date d’émission (iat). Cette valeur doit être un nombre entier. -
iat(émis à l’heure) est un horodatage Unix UTC du moment où le jeton JWT a été émis. (Voir la note pourexpconcernant les horodatages Unix.) Cette valeur doit être un nombre entier. -
jti(ID JWT) est l’identifiant de participant utilisé pour le suivi et pour faire référence à un participant auquel le jeton est accordé. Chaque jeton doit avoir un identifiant de participant unique. Il doit s’agir d’une chaîne de caractères sensible à la casse, d’une longueur maximale de 64 caractères, contenant uniquement des caractères alphanumériques, des tirets (-) et des underscores (_). Aucun autre caractère spécial n’est autorisé.
-
-
user_idest un nom facultatif attribué par le client pour faciliter l’identification du jeton ; il peut servir à associer un participant à un utilisateur dans les propres systèmes du client. Cela doit correspondre au champuserIddans la requête API CreateParticipantToken. Il peut s’agir de n’importe quel texte encodé en UTF-8 et d’une chaîne de 128 caractères maximum. Ce champ est visible par tous les participants à la scène et ne doit pas être utilisé pour des informations d’identification personnelle, confidentielles ou sensibles. -
resourceest l’ARN de la scène ; par exemple,arn:aws:ivs:us-east-1:123456789012:stage/oRmLNwuCeMlQ. -
topicest l’ID de la scène, qui peut être extrait de l’ARN de la scène. Par exemple, si l’ARN de la scène estarn:aws:ivs:us-east-1:123456789012:stage/oRmLNwuCeMlQ, l’ID de la scène estoRmLNwuCeMlQ. -
events_urldoit être le point de terminaison des événements renvoyé par l’opération CreateStage ou GetStage. Il est recommandé de mettre en cache cette valeur lors de la création de la scène, pour une durée maximale de 14 jours. Un exemple de valeur estwss://global.events.live-video.net. -
whip_urldoit être le point de terminaison WHIP renvoyé par l’opération CreateStage ou GetStage. Il est recommandé de mettre en cache cette valeur lors de la création de la scène, pour une durée maximale de 14 jours. Un exemple de valeur esthttps://453fdfd2ad24df.global-bm.whip.live-video.net. -
capabilitiesspécifie les capacités du jeton ; les valeurs valides sontallow_publishetallow_subscribe. Pour les jetons réservés aux abonnés, définissez uniquementallow_subscribesurtrue. -
attributesest un champ facultatif dans lequel vous pouvez spécifier des attributs fournis par l’application pour les encoder dans le jeton et les attacher à une scène. Les clés et valeurs de la carte peuvent contenir du texte encodé en UTF-8. La longueur totale maximale de ce champ est de 1 Ko. Ce champ est visible par tous les participants à la scène et ne doit pas être utilisé pour des informations d’identification personnelle, confidentielles ou sensibles. -
versiondoit avoir pour valeur1.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" }
Schéma du jeton : signature
Pour créer la signature, utilisez la clé privée avec l’algorithme spécifié dans l’en-tête (ES384) pour signer l’en-tête encodé et la charge utile encodée.
ECDSASHA384( base64UrlEncode(header) + "." + base64UrlEncode(payload), <private-key> )
Instructions
-
Générez la signature du jeton à l’aide d’un algorithme de signature ES384 et d’une clé privée associée à la clé publique fournie à IVS.
-
Assemblez le jeton.
base64UrlEncode(header) + "." + base64UrlEncode(payload) + "." + base64UrlEncode(signature)
Création de jetons à l’aide de l’API de diffusion en temps réel IVS
Comme indiqué ci-dessus, une application cliente demande un jeton à votre application serveur, qui appelle CreateParticipantToken à l’aide d’un AWS SDK ou d’une demande signée avec SigV4. Étant donné que les informations d’identification AWS sont utilisées pour appeler l’API, le jeton doit être généré dans une application sécurisée côté serveur, et non dans l’application côté client.
Lors de la création d’un jeton de participant, vous pouvez éventuellement spécifier des attributs et/ou des fonctionnalités :
-
Vous pouvez spécifier des attributs fournis par l’application pour les encoder dans le jeton et les attacher à une scène. Les clés et valeurs de la carte peuvent contenir du texte encodé en UTF-8. La longueur totale maximale de ce champ est de 1 Ko. Ce champ est visible par tous les participants à la scène et ne doit pas être utilisé pour des informations d’identification personnelle, confidentielles ou sensibles.
-
Vous pouvez spécifier les fonctionnalités activées par le jeton. La valeur par défaut est
PUBLISHetSUBSCRIBE, qui permet au participant d’envoyer et de recevoir des fichiers audio et vidéo, mais vous pouvez émettre des jetons dotés d’un sous-ensemble de fonctionnalités. Par exemple, vous pouvez émettre un jeton n’ayant que la capacitéSUBSCRIBEpour les modérateurs. Dans ce cas, les modérateurs peuvent voir les participants qui envoient des vidéos, mais ne peuvent pas envoyer leurs propres vidéos.
Pour plus de détails, voir CreateParticipantToken.
Vous pouvez créer des jetons de participant via la console ou l’interface CLI à des fins de test et de développement, mais vous souhaiterez très probablement les créer à l’aide de l’AWS SDK dans votre environnement de production.
Vous devez disposer d’un moyen de distribuer les jetons de votre serveur à chaque client (par exemple, au moyen d’une demande d’API). Nous ne proposons pas cette fonctionnalité. Pour ce guide, vous pouvez simplement copier et coller les jetons dans le code client en suivant les étapes suivantes.
Important : considérez les jetons comme opaques ; ne développez pas de fonctionnalités reposant sur leur contenu. Le format des jetons pourrait changer à l’avenir.
Instructions de la console
-
Accédez à la scène que vous avez créée à l’étape précédente.
-
Sélectionnez Créer un jeton. La fenêtre Créer un jeton s’affiche.
-
Saisissez un ID utilisateur à associer au jeton. Il peut s’agir de n’importe quel texte codé en UTF-8.
-
Sélectionnez Créer.
-
Copiez le jeton. Important : veillez à enregistrer le jeton. IVS ne le stocke pas et vous ne pourrez pas le récupérer ultérieurement.
Instructions de la CLI
Pour créer un jeton avec l’AWS CLI, vous devez d’abord télécharger et configurer l’interface CLI sur votre machine. Pour plus de détails, consultez le Guide de l'utilisateur de l'Interface de ligne de commande AWS. La génération de jetons avec l’AWS CLI convient aux tests, mais pour la production, nous vous recommandons de générer les jetons côté serveur à l’aide de l’AWS SDK (voir les instructions ci-dessous).
-
Exécutez la commande
create-participant-tokenavec l’ARN de la scène. Incluez l’une ou l’ensemble des fonctions suivantes :"PUBLISH"ou"SUBSCRIBE".aws ivs-realtime create-participant-token --stage-arn arn:aws:ivs:us-west-2:123456789012:stage/VSWjvX5XOkU3 --capabilities '["PUBLISH", "SUBSCRIBE"]' -
Cela renvoie un jeton de participant :
{ "participantToken": { "capabilities": [ "PUBLISH", "SUBSCRIBE" ], "expirationTime": "2023-06-03T07:04:31+00:00", "participantId": "tU06DT5jCJeb", "token": "eyJhbGciOiJLTVMiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE2NjE1NDE0MjAsImp0aSI6ImpGcFdtdmVFTm9sUyIsInJlc291cmNlIjoiYXJuOmF3czppdnM6dXMtd2VzdC0yOjM3NjY2NjEyMTg1NDpzdGFnZS9NbzhPUWJ0RGpSIiwiZXZlbnRzX3VybCI6IndzczovL3VzLXdlc3QtMi5ldmVudHMubGl2ZS12aWRlby5uZXQiLCJ3aGlwX3VybCI6Imh0dHBzOi8vNjZmNzY1YWM4Mzc3Lmdsb2JhbC53aGlwLmxpdmUtdmlkZW8ubmV0IiwiY2FwYWJpbGl0aWVzIjp7ImFsbG93X3B1Ymxpc2giOnRydWUsImFsbG93X3N1YnNjcmliZSI6dHJ1ZX19.MGQCMGm9affqE3B2MAb_DSpEm0XEv25hfNNhYn5Um4U37FTpmdc3QzQKTKGF90swHqVrDgIwcHHHIDY3c9eanHyQmcKskR1hobD0Q9QK_GQETMQS54S-TaKjllW9Qac6c5xBrdAk" } } -
Enregistrez ce jeton. Vous en aurez besoin pour rejoindre la scène et envoyer et recevoir une vidéo.
AWSInstructions du SDK
Vous pouvez utiliser le SDK AWS pour créer des jetons. Vous trouverez ci-dessous les instructions concernant le SDK AWS utilisant JavaScript.
Important : ce code doit être exécuté côté serveur et sa sortie doit être transmise au client.
Prérequis : pour utiliser l’exemple de code ci-dessous, vous devez installer le package aws-sdk/client-ivs-realtime. Pour plus de détails, consultez Prise en main de l’AWS SDK pour 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);
Jetons de connexion
Un jeton de connexion est un JWT autosigné qui autorise une connexion réseau partagée. Un client peut réutiliser cette connexion lorsqu’il passe d’une scène à l’autre dans le même compte AWS et la même région, jusqu’à l’expiration du jeton.
Créez et signez des jetons de connexion sur votre serveur à l’aide de la paire de clés créée précédemment. Envoyez le jeton de connexion au client avant qu’il ne commence un flux de travail impliquant des passages d’une scène à l’autre. Le client crée une RealTimeConnection et la fournit chaque fois qu’il crée une scène. Le client utilise ensuite le jeton de participant approprié pour chaque scène qu’il rejoint.
En-tête du jeton
Utilisez l’en-tête du jeton décrit dans Créer des jetons de participant avec une paire de clés.
Données utiles du jeton
{ "exp": 1697322063, "iat": 1697149263, "jti": "Mx6clRRHODPy", "account_id": "123456789012", "region": "us-west-2", "events_url": "wss://global.events.live-video.net", "version": "1.0" }
Les données utiles contiennent des données spécifiques à IVS. Tous les champs sont obligatoires :
-
Dans la spécification JWT, les
RegisteredClaimssont des revendications réservées qui doivent être présentes pour que le jeton soit valide :-
exp(heure d’expiration) est un horodatage Unix UTC indiquant le moment où le jeton expire. Un jeton peut expirer jusqu’à quatre semaines après sa création. -
iat(heure d’émission) est un horodatage Unix UTC indiquant le moment où le JWT a été émis. -
jti(ID JWT) est un ID de jeton unique. Générez un nouvel ID sensible à la casse pour chaque jeton de connexion. L’ID peut contenir jusqu’à 64 caractères alphanumériques, des traits d’union (-) et des traits de soulignement (_).
-
-
account_idest l’ID du compte AWS propriétaire des scènes. -
regionest la région d’origine de la clé publique IVS utilisée pour signer le jeton. -
events_urldoit avoir pour valeurwss://global.events.live-video.net. -
versiondoit avoir pour valeur1.0.
Un jeton de connexion ne contient ni ARN de scène, ni ID de scène, ni point de terminaison WHIP, ni capacités de participant, ni attributs de participant, ni ID utilisateur. Ces valeurs se trouvent dans le jeton de participant de la scène que le client rejoint.
Signez le jeton comme décrit dans Créer des jetons de participant avec une paire de clés, en utilisant l’en-tête et les données utiles du jeton de connexion ci-dessus.