Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Création de cookies signés en utilisant PHP
L'exemple de code suivant est similaire à celui du in Créer une signature d’URL avec PHP en ce sens qu'il crée un lien vers une vidéo. Cependant, au lieu de signer l'URL dans le code, cet exemple signe les cookies avec la create_signed_cookies()
fonction. Le joueur côté client utilise les cookies pour authentifier chaque demande auprès de la distribution. CloudFront
Cette approche est utile pour diffuser du contenu, tel que HTTP Live Streaming (HLS) ou Dynamic Adaptive Streaming over HTTP (DASH), lorsque le client doit effectuer plusieurs demandes pour récupérer le manifeste, les segments et les ressources de lecture associées. En utilisant des cookies signés, le client peut authentifier chaque demande sans avoir à générer une nouvelle URL signée pour chaque segment.
Note
-
La création d'une signature d'URL n'est qu'une partie du processus de diffusion de contenu privé à l'aide de cookies signés. Pour de plus amples informations, veuillez consulter Utiliser des cookies signés.
Les sections suivantes décomposent l'exemple de code en plusieurs parties. Vous trouverez l'exemple de code complet ci-dessous.
Création de la signature RSA SHA-1
Cet exemple de code effectue les opérations suivantes :
-
La fonction
rsa_sha1_sign
hache et signe la déclaration de politique. Les arguments requis sont une déclaration de politique et la clé privée qui correspond à une clé publique qui se trouve dans un groupe de clés approuvé pour votre distribution. -
Ensuite, la fonction
url_safe_base64_encode
crée une version à URL sécurisée de la signature.function rsa_sha1_sign($policy, $private_key_filename) { $signature = ""; $fp = fopen($private_key_filename, "r"); $priv_key = fread($fp, 8192); fclose($fp); $pkeyid = openssl_get_privatekey($priv_key); openssl_sign($policy, $signature, $pkeyid); openssl_free_key($pkeyid); return $signature; } function url_safe_base64_encode($value) { $encoded = base64_encode($value); return str_replace( array('+', '=', '/'), array('-', '_', '~'), $encoded); }
Créez les cookies signés
Le code suivant construit et crée les cookies signés, en utilisant les attributs de cookie suivants : CloudFront-Expires
CloudFront-Signature
, etCloudFront-Key-Pair-Id
. Le code utilise une politique personnalisée.
function create_signed_cookies($resource, $private_key_filename, $key_pair_id, $expires, $client_ip = null) { $policy = array( 'Statement' => array( array( 'Resource' => $resource, 'Condition' => array( 'DateLessThan' => array('AWS:EpochTime' => $expires) ) ) ) ); if ($client_ip) { $policy['Statement'][0]['Condition']['IpAddress'] = array('AWS:SourceIp' => $client_ip . '/32'); } $policy = json_encode($policy); $encoded_policy = url_safe_base64_encode($policy); $signature = rsa_sha1_sign($policy, $private_key_filename); $encoded_signature = url_safe_base64_encode($signature); return array( 'CloudFront-Policy' => $encoded_policy, 'CloudFront-Signature' => $encoded_signature, 'CloudFront-Key-Pair-Id' => $key_pair_id ); }
Pour de plus amples informations, veuillez consulter Définissez des cookies signés à l'aide d'une politique personnalisée.
Code complet
L'exemple de code suivant fournit une démonstration complète de la création de cookies CloudFront signés avec PHP. Vous pouvez télécharger l'exemple complet depuis le fichier demo-php.zip.
Dans l'exemple suivant, vous pouvez modifier l'$policy Condition
élément pour autoriser à la fois les plages d' IPv6 adresses IPv4 et les plages d'adresses. Par exemple, consultez la section Utilisation IPv6 des adresses dans les politiques IAM du guide de l'utilisateur d'Amazon Simple Storage Service.
<?php function rsa_sha1_sign($policy, $private_key_filename) { $signature = ""; $fp = fopen($private_key_filename, "r"); $priv_key = fread($fp, 8192); fclose($fp); $pkeyid = openssl_get_privatekey($priv_key); openssl_sign($policy, $signature, $pkeyid); openssl_free_key($pkeyid); return $signature; } function url_safe_base64_encode($value) { $encoded = base64_encode($value); return str_replace( array('+', '=', '/'), array('-', '_', '~'), $encoded); } function create_signed_cookies($resource, $private_key_filename, $key_pair_id, $expires, $client_ip = null) { $policy = array( 'Statement' => array( array( 'Resource' => $resource, 'Condition' => array( 'DateLessThan' => array('AWS:EpochTime' => $expires) ) ) ) ); if ($client_ip) { $policy['Statement'][0]['Condition']['IpAddress'] = array('AWS:SourceIp' => $client_ip . '/32'); } $policy = json_encode($policy); $encoded_policy = url_safe_base64_encode($policy); $signature = rsa_sha1_sign($policy, $private_key_filename); $encoded_signature = url_safe_base64_encode($signature); return array( 'CloudFront-Policy' => $encoded_policy, 'CloudFront-Signature' => $encoded_signature, 'CloudFront-Key-Pair-Id' => $key_pair_id ); } $private_key_filename = '/home/test/secure/example-priv-key.pem'; $key_pair_id = 'K2JCJMDEHXQW5F'; $base_url = 'https://d1234.cloudfront.net'; $expires = time() + 3600; // 1 hour from now // Get the viewer real IP from the x-forward-for header as $_SERVER['REMOTE_ADDR'] will return viewer facing IP. An alternative option is to use CloudFront-Viewer-Address header. Note that this header is a trusted CloudFront immutable header. Example format: IP:PORT ("CloudFront-Viewer-Address": "1.2.3.4:12345") $client_ip = $_SERVER['HTTP_X_FORWARDED_FOR']; // For HLS manifest and segments (using wildcard) $hls_resource = $base_url . '/sign/*'; $signed_cookies = create_signed_cookies($hls_resource, $private_key_filename, $key_pair_id, $expires, $client_ip); // Set the cookies $cookie_domain = parse_url($base_url, PHP_URL_HOST); foreach ($signed_cookies as $name => $value) { setcookie($name, $value, $expires, '/', $cookie_domain, true, true); } ?> <!DOCTYPE html> <html> <head> <title>CloudFront Signed HLS Stream with Cookies</title> </head> <body> <h1>Amazon CloudFront Signed HLS Stream with Cookies</h1> <h2>Expires at <?php echo gmdate('Y-m-d H:i:s T', $expires); ?> only viewable by IP <?php echo $client_ip; ?></h2> <div id='hls-video'> <video id="video" width="640" height="360" controls></video> </div> <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script> <script> var video = document.getElementById('video'); var manifestUrl = '<?php echo $base_url; ?>/sign/manifest.m3u8'; if (Hls.isSupported()) { var hls = new Hls(); hls.loadSource(manifestUrl); hls.attachMedia(video); } else if (video.canPlayType('application/vnd.apple.mpegurl')) { video.src = manifestUrl; } </script> </body> </html>
Au lieu d'utiliser des cookies signés, vous pouvez utiliser des cookies signés URLs. Pour de plus amples informations, veuillez consulter Créer une signature d’URL avec PHP.