Buat cookie yang ditandatangani menggunakan PHP - Amazon CloudFront

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Buat cookie yang ditandatangani menggunakan PHP

Contoh kode berikut mirip dengan contoh Buat tanda tangan URL menggunakan PHP di mana ia membuat tautan ke video. Namun, alih-alih menandatangani URL dalam kode, contoh ini menandatangani cookie dengan create_signed_cookies() fungsi tersebut. Pemain sisi klien menggunakan cookie untuk mengautentikasi setiap permintaan ke distribusi. CloudFront

Pendekatan ini berguna untuk streaming konten, seperti HTTP Live Streaming (HLS) atau Dynamic Adaptive Streaming melalui HTTP (DASH), di mana klien perlu membuat beberapa permintaan untuk mengambil manifes, segmen, dan aset pemutaran terkait. Dengan menggunakan cookie yang ditandatangani, klien dapat mengautentikasi setiap permintaan tanpa perlu membuat URL baru yang ditandatangani untuk setiap segmen.

catatan
  • Membuat tanda tangan URL hanyalah salah satu bagian dari proses penyajian konten pribadi menggunakan cookie yang ditandatangani. Untuk informasi selengkapnya, lihat Gunakan cookie yang ditandatangani.

Bagian berikut memecah contoh kode menjadi bagian-bagian individual. Anda dapat menemukan contoh kode lengkap di bawah ini.

Buat tanda tangan RSA SHA-1

Contoh kode ini melakukan hal berikut:

  1. Fungsi melakukan rsa_sha1_sign hash dan menandatangani pernyataan kebijakan. Argumen yang diperlukan adalah pernyataan kebijakan dan kunci pribadi yang sesuai dengan kunci publik yang ada dalam grup kunci tepercaya untuk distribusi Anda.

  2. Selanjutnya, url_safe_base64_encode membuat versi URL-safe dari tanda tangan.

    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); }

Kode berikut membangun membuat cookie yang ditandatangani, menggunakan atribut cookie berikut:CloudFront-Expires,CloudFront-Signature, danCloudFront-Key-Pair-Id. Kode menggunakan kebijakan khusus.

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 ); }

Untuk informasi selengkapnya, lihat Tetapkan cookie yang ditandatangani menggunakan kebijakan khusus.

Kode lengkap

Kode contoh berikut memberikan demonstrasi lengkap untuk membuat cookie yang CloudFront ditandatangani dengan PHP. Anda dapat mengunduh contoh lengkap dari file demo-php.zip.

Dalam contoh berikut, Anda dapat memodifikasi $policy Condition elemen untuk memungkinkan keduanya IPv4 dan rentang IPv6 alamat. Sebagai contoh, lihat Menggunakan IPv6 alamat dalam kebijakan IAM di Panduan Pengguna Layanan Penyimpanan Sederhana Amazon.

<?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>

Alih-alih menggunakan cookie yang ditandatangani, Anda dapat menggunakan ditandatangani URLs. Untuk informasi selengkapnya, lihat Buat tanda tangan URL menggunakan PHP.