Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Crea cookie firmati utilizzando PHP
Il seguente esempio di codice è simile all'esempio in the Creazione di una firma per URL utilizzando PHP in quanto crea un collegamento a un video. Tuttavia, invece di firmare l'URL nel codice, questo esempio firma i cookie con la create_signed_cookies()
funzione. Il player lato client utilizza i cookie per autenticare ogni richiesta alla distribuzione. CloudFront
Questo approccio è utile per lo streaming di contenuti, come HTTP Live Streaming (HLS) o Dynamic Adaptive Streaming over HTTP (DASH), in cui il client deve effettuare più richieste per recuperare il manifest, i segmenti e le relative risorse di riproduzione. Utilizzando i cookie firmati, il client può autenticare ogni richiesta senza dover generare un nuovo URL firmato per ogni segmento.
Nota
-
La creazione di una firma URL è solo una parte del processo di pubblicazione di contenuti privati utilizzando cookie firmati. Per ulteriori informazioni, consulta Utilizza cookie firmati.
Le sezioni seguenti suddividono l'esempio di codice in singole parti. Di seguito è riportato l'esempio di codice completo.
Crea la firma RSA SHA-1
Questo esempio di codice esegue le seguenti operazioni:
-
La funzione esegue l'
rsa_sha1_sign
hashing e la firma della dichiarazione politica. Gli argomenti richiesti sono una dichiarazione di policy e la chiave privata che corrisponde a una chiave pubblica appartenente a un gruppo di chiavi attendibili per la distribuzione. -
Successivamente, la funzione
url_safe_base64_encode
crea una versione URL-safe della firma.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); }
Crea i cookie firmati
Il codice seguente costruisce a crea i cookie firmati, utilizzando i seguenti attributi dei cookie:CloudFront-Expires
,CloudFront-Signature
, eCloudFront-Key-Pair-Id
. Il codice utilizza una politica personalizzata.
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 ); }
Per ulteriori informazioni, consulta Imposta i cookie firmati utilizzando una politica personalizzata.
Codice completo
Il codice di esempio seguente fornisce una dimostrazione completa della creazione di cookie CloudFront firmati con PHP. È possibile scaricare l'esempio completo dal file demo-php.zip.
Nell'esempio seguente, è possibile modificare l'$policy Condition
elemento in modo da consentire sia gli intervalli di indirizzi che IPv4 gli intervalli di IPv6 indirizzi. Per un esempio, IPv6 consulta Using address in IAM policies nella Amazon Simple Storage Service User Guide.
<?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>
Invece di utilizzare cookie firmati, puoi utilizzare cookie firmati URLs. Per ulteriori informazioni, consulta Creazione di una firma per URL utilizzando PHP.