Ce guide explique comment générer un jeton et présente les champs obligatoires et facultatifs pour les jetons.
Pour créer un jeton, vous devez composer une chaîne à signer, que nous appellerons une valeur signée dans le présent guide. La valeur signée inclut des paramètres qui décrivent le contenu que vous protégez, le délai d'expiration de la valeur signée, etc.
Vous utilisez la valeur signée lors de la création d'une chaîne de jeton. Vous créez une chaîne de jeton en composant les paramètres du jeton, par exemple un code d'authentification des messages basé sur le hachage (HMAC, Hash-based Message Authentication Code) avec clé symétrique de la valeur signée.
Media CDN utilise le jeton composé final pour protéger votre contenu.
Créer un jeton
Créez une valeur signée en concaténant une chaîne contenant les champs de jeton requis et les champs de jeton facultatifs souhaités. Séparez chaque champ et tous les paramètres à l'aide d'un caractère tilde
~
.Signez la valeur signée avec une signature Ed25519 ou un HMAC à clé symétrique.
Composez le jeton en concaténant une chaîne contenant les champs de jeton obligatoires et les champs de jeton facultatifs. Séparez chaque champ et tous les paramètres à l'aide d'un caractère tilde
~
.Lors de la composition du jeton, les valeurs de chacun des paramètres sont les mêmes entre la valeur signée et la chaîne de jeton, à l'exception des cas suivants:
FullPath
Headers
L'exemple de code suivant montre comment créer un jeton par programmation:
Python
Pour vous authentifier auprès de Media CDN, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Java
Pour vous authentifier auprès de Media CDN, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Les sections suivantes décrivent les champs utilisés par les jetons.
Champs de jeton obligatoires
Les champs suivants sont obligatoires pour chaque jeton:
Expires
- L'une des options suivantes :
PathGlobs
URLPrefix
FullPath
- Choisissez l'une des options suivantes :
Signature
hmac
Sauf indication contraire, les noms de paramètres et leurs valeurs sont sensibles à la casse.
Le tableau suivant explique chaque paramètre :
Nom / Alias du champ | Paramètres de jeton | Valeur signée |
---|---|---|
|
Nombre entier de secondes écoulées depuis l'époque Unix (1970-01-01T00:00:00Z) | Expires=EXPIRATION_TIME , après quoi le jeton n'est plus valide. |
|
Liste de cinq segments de chemin d'accès au maximum auxquels accorder l'accès. Les segments peuvent être délimités par des virgules (
Les paramètres de chemin, indiqués par des points-virgules ( Pour cette raison, assurez-vous que votre URL ne contient pas les caractères spéciaux suivants: |
PathGlobs=PATHS |
URLPrefix |
URL encodée en base64 sécurisée pour le Web, y compris le protocole Par exemple, voici quelques valeurs valides pour URLPrefix pour "https://example.com/foo/bar.ts" : "https://example.com", "https://example.com/foo" et "https://example.com/foo/bar". |
URLPrefix=BASE_64_URL_PREFIX |
FullPath |
Aucun Lorsque vous spécifiez FullPath dans un jeton, ne dupliquez pas le chemin d'accès que vous avez spécifié dans la valeur signée. Dans un jeton, incluez le nom du champ sans = . |
FullPath=FULL_PATH_TO_OBJECT |
Signature |
Version de la signature encodée en base64 adapté au Web. | Non applicable |
hmac |
Version de la valeur HMAC encodée en base64 adaptée au Web. | Non applicable |
Syntaxe des caractères génériques PathGlobs
Le tableau suivant explique la syntaxe des caractères génériques PathGlobs
.
Opérateur | Correspondance établie | Examples |
---|---|---|
* (astérisque) |
Correspond à zéro ou plusieurs caractères dans le chemin d'accès de l'URL, y compris les caractères de barre oblique (/ ).
|
|
? (point d'interrogation) |
Correspond à un seul caractère dans le chemin d'accès de l'URL, sans inclure les caractères de barre oblique (/ ).
|
/videos/s?main.m3u8 correspond à /videos/s1main.m3u8 . Il ne correspond à aucun des éléments /videos/s01main.m3u8 ou /videos/s/main.m3u8 .
|
Les expressions génériques doivent commencer par un astérisque (*
) ou une barre oblique (/
) pour les chemins d'URL.
Étant donné que *
et /*
correspondent à tous les chemins d'URL, nous vous déconseillons de les utiliser dans vos jetons signés. Pour une protection maximale, assurez-vous que vos globs correspondent au contenu auquel vous souhaitez accorder l'accès.
Champs de jeton facultatifs
Sauf indication contraire, les noms de paramètres et leurs valeurs sont sensibles à la casse.
Le tableau suivant explique les noms de paramètres, les éventuels alias et les détails des paramètres facultatifs:
Nom du champ / Alias | Paramètres | Valeur signée |
---|---|---|
|
Nombre entier de secondes écoulées depuis l'époque Unix (1970-01-01T00:00:00Z) | Starts=START_TIME |
IPRanges |
Liste incluant jusqu'à cinq adresses IPv4 et IPv6 au format CIDR pour lesquelles cette URL est valide au format base64 web-safe. Par exemple, pour spécifier les plages d'adresses IP "192.6.13.13/32,193.5.64.135/32", spécifiez Les plages d'adresses IP peuvent ne pas être utiles à inclure dans les jetons lorsque les clients sont susceptibles d'effectuer des migrations WAN ou dans les cas où le chemin d'accès réseau à l'interface de l'application est différent du chemin de distribution.
Media CDN rejette les clients disposant d'un code Les cas suivants peuvent entraîner le rejet des clients avec le code
Tous ces facteurs peuvent contribuer à ce qu'un client donné ait une adresse IP non déterministe pendant une session de lecture vidéo. Si l'adresse IP du client change après avoir accordé l'accès et que le client tente de télécharger un segment vidéo dans son tampon de lecture, il reçoit une erreur |
IPRanges=BASE_64_IP_RANGES |
|
Chaîne arbitraire, utile pour l'analyse des journaux ou le traçage de la lecture. Pour éviter de créer un jeton non valide, utilisez des chaînes encodées en base64 ou encodées en %. Les caractères suivants ne doivent pas être utilisés pour |
SessionID=SESSION_ID_VALUE |
|
Chaîne arbitraire, utile pour l'analyse des journaux. Pour éviter de créer un jeton non valide, utilisez des chaînes encodées en base64 ou encodées en %. Les caractères suivants ne doivent pas être utilisés pour |
data=DATA_VALUE |
Headers |
Liste des noms des champs d'en-tête séparés par une virgule. Les noms d'en-tête ne sont pas sensibles à la casse pour les recherches dans la requête. Les noms d'en-tête dans les valeurs signées sont sensibles à la casse. Si un en-tête est manquant, la valeur est une chaîne vide. Si plusieurs copies d'un en-tête existent, elles sont concatenatées par des virgules. | Headers=HEADER_1_NAME=HEADER_1_EXPECTED_VALUE,
HEADER_2_NAME=HEADER_2_EXPECTED_VALUE |
Examples
Les sections suivantes présentent des exemples de génération de jetons.
Exemple utilisant FullPath
Prenons l'exemple suivant utilisant le champ FullPath
:
- Article demandé:
http://example.com/tv/my-show/s01/e01/playlist.m3u8
- Date d'expiration: 160000000
La valeur signée est la suivante:
Expires=160000000~FullPath=/tv/my-show/s01/e01/playlist.m3u8
Pour créer un jeton, signez la valeur signée avec une signature Ed25519 ou un HMAC à clé symétrique.
Voici des exemples de jetons créés à partir d'une valeur signée:
Signature Ed25519
Expires=160000000~FullPath~Signature=SIGNATURE_OF_SIGNED_VALUE
où SIGNATURE_OF_SIGNED_VALUE est la signature ED25519 de la valeur signée créée précédemment.
HMAC à clé symétrique
Expires=160000000~FullPath~hmac=HMAC_OF_SIGNED_VALUE
Où HMAC_OF_SIGNED_VALUE est le HMAC à clé symétrique de la valeur signée créée précédemment.
Dans les exemples précédents, FullPath
est fourni dans le jeton, mais la valeur n'est pas répétée à partir du chemin d'accès spécifié dans la valeur signée. Vous pouvez ainsi signer le chemin d'accès complet de la requête sans dupliquer la requête dans le jeton.
Exemple utilisant URLPrefix
Prenons l'exemple suivant utilisant le champ URLPrefix
:
- Article demandé:
http://example.com/tv/my-show/s01/e01/playlist.m3u8
- Date d'expiration: 160000000
La valeur signée est la suivante:
Expires=160000000~URLPrefix=aHR0cDovL2V4YW1wbGUuY29tL3R2L215LXNob3cvczAxL2UwMS9wbGF5bGlzdC5tM3U4
Dans l'exemple précédent, nous avons remplacé le chemin d'accès à l'élément demandé, http://example.com/tv/my-show/s01/e01/playlist.m3u8
, par le chemin d'accès à l'élément au format Base64 sécurisé pour le Web, aHR0cDovL2V4YW1wbGUuY29tL3R2L215LXNob3cvczAxL2UwMS9wbGF5bGlzdC5tM3U4
.
Pour créer un jeton, signez la valeur signée avec une signature Ed25519 ou un HMAC à clé symétrique.
Voici des exemples de jetons créés à partir d'une valeur signée:
Signature Ed25519
Expires=160000000~URLPrefix=aHR0cDovL2V4YW1wbGUuY29tL3R2L215LXNob3cvczAxL2UwMS9wbGF5bGlzdC5tM3U4~Signature=SIGNATURE_OF_SIGNED_VALUE
où SIGNATURE_OF_SIGNED_VALUE est la signature ED25519 de la valeur signée créée précédemment.
HMAC à clé symétrique
Expires=160000000~URLPrefix=aHR0cDovL2V4YW1wbGUuY29tL3R2L215LXNob3cvczAxL2UwMS9wbGF5bGlzdC5tM3U4~hmac=HMAC_OF_SIGNED_VALUE
Où HMAC_OF_SIGNED_VALUE est le HMAC à clé symétrique de la valeur signée créée précédemment.
Exemple utilisant Headers
Prenons l'exemple suivant utilisant le champ Headers
:
- Article demandé:
http://example.com/tv/my-show/s01/e01/playlist.m3u8
- Date d'expiration: 160000000
- Valeur PathGlobs:
*
- En-têtes de requête attendus :
user-agent: browser
accept: text/html
La valeur signée est la suivante:
Expires=160000000~PathGlobs=*~Headers=user-agent=browser,accept=text/html
Pour créer un jeton, signez la valeur signée avec une signature Ed25519 ou un HMAC à clé symétrique.
Voici des exemples de jetons créés à partir d'une valeur signée:
Signature Ed25519
Expires=160000000~PathGlobs=*~Headers=user-agent,accept~Signature=SIGNATURE_OF_SIGNED_VALUE
où SIGNATURE_OF_SIGNED_VALUE est la signature ED25519 de la valeur signée créée précédemment.
HMAC à clé symétrique
Expires=160000000~PathGlobs=*~Headers=user-agent,accept~hmac=HMAC_OF_SIGNED_VALUE
Où HMAC_OF_SIGNED_VALUE est le HMAC à clé symétrique de la valeur signée créée précédemment.
Dans les exemples précédents, Headers=user-agent,accept
est fourni dans le jeton, mais les valeurs d'en-tête attendues ne sont pas répétées à partir de la valeur signée. Cela vous permet de signer des paires clé-valeur d'en-tête de requête spécifiques sans dupliquer les valeurs dans le jeton.