Le Blog Amazon Web Services

Protéger vos contenus médias avec l’authentification par jeton

La diffusion de vidéos n’est plus exclusivement le fait des entreprises du secteur des médias. Les écoles, les enseignes de e-commerce, les entreprises dites technologiques et les banques créent du contenu audiovisuel pour le distribuer directement à leurs clients. La diffusion de vidéos, en direct et à la demande, est devenu l’outil de communication le plus courant pour atteindre les publics cibles. À mesure que la valeur et le nombre de contenus vidéos augmentent, la création d’un workflow de distribution sécurisé permet de s’assurer que seuls les utilisateurs légitimes y ont accès.

Méthodes d’authentification d’Amazon CloudFront

Les entreprises qui distribuent du contenu multimédia sur Internet doivent protéger leurs flux de données afin d’empêcher tout accès non autorisé et toute redistribution de leurs contenus. Amazon CloudFront vous donne la possibilité de délivrer du contenu privé avec des URL et des cookies signés. Vous pouvez également utiliser l’authentification par jeton en ajoutant Lambda@Edge à votre distribution. Lambda@Edge est une fonctionnalité d’Amazon CloudFront qui vous permet de déployer votre code au plus près des utilisateurs de votre application, ce qui améliore les performances et réduit la latence.

Les options suivantes permettent de servir du contenu sécurisé en toute sécurité à l’aide de CloudFront :

  • Exiger que vos utilisateurs accèdent à votre contenu privé en utilisant des URL signées CloudFront ou des cookies signés.
  • Exiger que vos utilisateurs accèdent à votre contenu en utilisant des URL CloudFront, et non des URL qui accèdent au contenu directement sur le serveur d’origine (par exemple, Amazon Simple Storage Service (Amazon S3) ou un serveur HTTP privé).
    • Il n’est pas nécessaire d’avoir des URL CloudFront, mais nous le recommandons pour empêcher les utilisateurs de contourner les restrictions que vous spécifiez dans les URL signées ou les cookies signés.
  • Avec Lambda@Edge, demandez aux utilisateurs de fournir des jetons au format Web JSON (JWT) pour accéder au contenu sécurisé.

Dans cet article, nous vous montrons comment mettre en œuvre l’authentification par jeton pour la distribution Amazon CloudFront à l’aide de Lambda@Edge, afin de protéger vos diffusions en direct et à la demande en OTT.

Jetons Web JSON avec Lambda@Edge

Les jetons Web JSON (JWT) sont une norme open source permettant de partager en toute sécurité des informations de données privées sous forme d’objets JSON. Les JWT sont signés numériquement à l’aide d’une clé secrète de 256 bits, ce qui permet de vérifier les informations et de les rendre fiables.

Avec Lambda@Edge, vous pouvez créer des fonctions personnalisées et les exécuter dans les Régions AWS et les Edge Location d’Amazon CloudFront.

Vous pouvez utiliser les fonctions Lambda pour modifier les requêtes et les réponses de CloudFront  :

  • Après que CloudFront reçoit une requête d’un utilisateur.
  • Avant que CloudFront ne transmette la requête à l’origine.
  • Après que CloudFront ait reçu la réponse de l’origine.
  • Avant que CloudFront ne transmette la réponse à l’utilisateur.

Aperçu de l’architecture

Composants de la solution

Dans ce billet de blog, nous parcourons l’implémentation du composant dans la web APP (dépôt GitHub). Nous examinerons également les composants cloud pour l’authentification, la validation des jetons et la mise en cache CDN.

Les ressources backend et frontend AWS sont construites à l’aide d’AWS Amplify, une solution complète qui permet aux développeurs web mobiles et frontend de créer et de déployer des applications complètes, sécurisées et évolutives. Avec AWS Amplify, vous pouvez configurer des backends d’applications en quelques minutes, les connecter à votre application en quelques lignes de code, et déployer des applications web statiques en trois étapes.

L’application web est construite en React et utilise Video.JS comme lecteur vidéo.

Après une authentification réussie, Amazon Cognito renvoie des jetons du groupe d’utilisateurs à votre application. Ensuite, vous pouvez utiliser le jeton pour accorder l’accès aux ressources du backend. Dans l’architecture proposée, le jeton est utilisé pour signer les demandes de contenu de flux média, la fonction Lambda@Edge décode et valide les attributs du jeton, authentifiant le spectateur afin de visionner le contenu.

Étapes du déploiement

1) Dépendances du projet

Pour réaliser l’intégration avec les composants AWS et héberger l’application web, nous utilisons AWS Amplify.

Pour les étapes complètes d’installation et de configuration d’AWS Amplify, veuillez consulter la documentation (Documentation Amplify pour React).

2) Clonez le dépôt

3) Démarrez votre environnement local

La page d’authentification devrait être chargée. Vous pouvez maintenant créer votre premier compte et vous connecter.

Après la connexion, le site local suivant devrait s’afficher :

 4) Ajoutez quelques contenus vidéo à un bucket Amazon S3

Nous avons utilisé Amplify Video pour créer du contenu VOD de test. Amplify Video est un plugin open-source pour le CLI d’Amplify, qui permet d’intégrer facilement la diffusion de vidéos à vos applications web ou mobiles. Grâce à AWS Amplify et aux Media Services AWS, vous pouvez également gérer les workflows de diffusion en direct via Amplify Video. Pour plus d’options et d’exemples d’implémentations, veuillez visiter amplify-video GitHub.

Amplify Video crée le bucket Amazon S3 pour stocker le contenu source, le contenu transcodé, et il déploie également la distribution CloudFront. Veuillez voir l’exemple de résultat de ‘amplify push’ :

Remarque : Amplify Video offre également la possibilité de protéger le contenu avec une URL signée. Vous pouvez trouver plus d’informations sur la façon d’utiliser l’URL signée en utilisant Amplify Video ici : Démarrer avec la VOD.

Transcodage test

Accédez à la console Amazon S3. Amplify Video a déployé plusieurs buckets dans votre environnement. Sélectionnez le bucket ‘Input’ et uploadez un fichier .mp4, qui est stocké localement sur votre ordinateur.

Une fois le fichier uploadé avec succès, naviguez dans la console AWS Elemental MediaConvert pour voir le lancement de votre tâche de transcodage. Cette tâche prend le fichier d’entrée, le transcode au format Apple HTTP Live Streaming (HLS) et envoie tous les fichiers manifests et chunks dans le bucket Amazon S3 intitulé ‘output’.

Test de la lecture média

Une fois que la tâche MediaConvert est complétée, retournez dans la console Amazon S3, et localisez le bucket de sortie. Lorsque vous êtes dans le bucket, vous devriez voir un dossier portant le nom du fichier que vous venez d’uploader. Dans ce dossier, vous devriez voir les fichiers de sortie créés par MediaConvert. Cherchez le manifest HLS, le fichier avec le nom de fichier et l’extension .m3u8, puis remplacez le domaine Amazon S3 par l’URL de sortie pour le contenu.

Le format de l’URL lisible est ‘Output URL for content’ + /nom du contenu/ + nom du contenu.m3u8

Exemple : https://someid.cloudfront.net/BigBuckBunny/BigBuckBunny.m3u8

5) Ajouter l’authentification JWT à votre distribution Amazon CloudFront

a) Installez les dépendances pour l’authentification JWT de Lambda@Edge

b) Editez le fichier de fonction index.js et ajoutez vos attributs de groupes d’utilisateurs Amazon Cognito

Ouvrez le fichier config.js, situé dans amplify/backend/function/jwtauth/src/config.js

Listez les ressources d’authentification auth créées et copiez l’identifiant du groupe d’utilisateurs Cognito.

L’identifiant du pool d’utilisateurs Cognito peut être trouvé dans l’URL renvoyée par l’exécution de amplify auth console

https://us-east-1.console.aws.amazon.com/cognito/users/?region=us-east-1 – /pool/us-east-SomeID/details

Copiez l’information du Pool Id et remplacez-la dans la variable USERPOOLID

c) Téléchargez et stockez la clé publique Web JSON (JWK) correspondante pour votre groupe d’utilisateurs. Elle est disponible dans une partie du JSON.

Vous pouvez trouver le jeu de clés Web (JWKS) à l’adresse suivante

https://cognito-idp.us-east-1.amazonaws.com/us-east-SomeID/.well-known/jwks.json

Pour plus d’informations sur les JWK et les ensembles JWK, voir la documentation Amazon Cognito sur la vérification d’un jeton Web JSON et la clé Web JSON  (JWK).

Vous pouvez voir l’exemple jwks.json dans la documentation JSON Web Token. Ensuite, remplacez le JWKS par les informations d’identification de votre groupe d’utilisateurs Cognito.

Ensuite, déployez votre fonction Lambda en exécutant simplement ‘amplify push’ dans le dossier de l’application d’origine.

6) Déployer vers Lambda@Edge

Maintenant que nous avons poussé la fonction de vérification du jeton JWT dans le cloud, nous la déployons vers notre distribution créée à l’étape 5.

a) Allez dans la console CloudFront, et récupérez l’ARN de la distribution créée à l’étape 5.

b) Allez dans la console Lambda et déployez la fonction dans Lambda@Edge.

7) Tests de bout en bout

Ouvrez maintenant votre application web et lisez un contenu de test.

Dans le champ URL de la vidéo, ajoutez l’URL CloudFront complète de votre ressource de sortie créée à l’étape 5.

Félicitations. Vous pouvez maintenant personnaliser vos distributions de contenu multimédia et vos applications en ajoutant une protection par authentification.

Conclusion

Dans cet article de blog, nous avons abordé les stratégies de protection des flux de médias à l’aide de l’authentification par jeton JWT. Cela permet de réduire la redistribution non autorisée de contenu numérique. Pour en savoir plus, consultez la documentation d’Amazon CloudFront pour trouver d’autres moyens de protéger le contenu privé.

Ressources supplémentaires

Article original par Arturo Velasco, Architecte de solutions spécialisé dans le domaine des médias et du divertissemen, et Osmar Bento, Spécialiste des médias et du divertissement AWS.