Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Firma de las URL de Amazon CloudFront con la versión 3 de AWS SDK para PHP
Las URL firmadas permiten ofrecer a los usuarios acceso a contenido privado. Una URL firmada incluye información adicional (por ejemplo, una fecha y hora de vencimiento), que le proporciona un mayor control sobre el acceso a su contenido. Esta información adicional aparece en una instrucción de política basada en una política predefinida o personalizada. Para obtener información acerca de cómo configurar las distribuciones privadas y por qué es necesario firmar las URL, consulte Distribuir contenido privado a través de Amazon CloudFront en la Guía para desarrolladores de Amazon CloudFront.
-
Creación de una URL firmada de Amazon CloudFront con getSignedURL.
-
Creación de una cookie firmada de Amazon CloudFront con getSignedCookie.
Todo el código de ejemplo de AWS SDK para PHP está disponible aquí en GitHub
Credenciales
Antes de ejecutar el código de ejemplo, configure sus credenciales de AWS, como se indica en Autenticación AWS con la AWS SDK para PHP versión 3. A continuación, importe AWS SDK para PHP, como se indica en Instalación del AWS SDK para PHP versión 3.
Para obtener más información sobre el uso de Amazon CloudFront, consulte la Guía para desarrolladores de Amazon CloudFront.
Firma de URL de CloudFront para distribuciones privadas
Para firmar una URL, puede usar el cliente de CloudFront del SDK. En primer lugar, debe crear un objeto CloudFrontClient. Para firmar una URL de CloudFront para un recurso de vídeo, puede usar una política predefinida o una personalizada.
Importaciones
require 'vendor/autoload.php'; use Aws\CloudFront\CloudFrontClient; use Aws\Exception\AwsException;
Código de muestra
function signPrivateDistribution( $cloudFrontClient, $resourceKey, $expires, $privateKey, $keyPairId ) { try { $result = $cloudFrontClient->getSignedUrl([ 'url' => $resourceKey, 'expires' => $expires, 'private_key' => $privateKey, 'key_pair_id' => $keyPairId ]); return $result; } catch (AwsException $e) { return 'Error: ' . $e->getAwsErrorMessage(); } } function signAPrivateDistribution() { $resourceKey = 'https://d13l49jEXAMPLE.cloudfront.net/my-file.txt'; $expires = time() + 300; // 5 minutes (5 * 60 seconds) from now. $privateKey = dirname(__DIR__) . '/cloudfront/my-private-key.pem'; $keyPairId = 'AAPKAJIKZATYYYEXAMPLE'; $cloudFrontClient = new CloudFrontClient([ 'profile' => 'default', 'version' => '2018-06-18', 'region' => 'us-east-1' ]); echo signPrivateDistribution( $cloudFrontClient, $resourceKey, $expires, $privateKey, $keyPairId ); } // Uncomment the following line to run this code in an AWS account. // signAPrivateDistribution();
Uso de una política personalizada al crear direcciones URL de CloudFront
Para utilizar una política personalizada, indique la clave policy en lugar de expires.
Importaciones
require 'vendor/autoload.php'; use Aws\CloudFront\CloudFrontClient; use Aws\Exception\AwsException;
Código de muestra
function signPrivateDistributionPolicy( $cloudFrontClient, $resourceKey, $customPolicy, $privateKey, $keyPairId ) { try { $result = $cloudFrontClient->getSignedUrl([ 'url' => $resourceKey, 'policy' => $customPolicy, 'private_key' => $privateKey, 'key_pair_id' => $keyPairId ]); return $result; } catch (AwsException $e) { return 'Error: ' . $e->getAwsErrorMessage(); } } function signAPrivateDistributionPolicy() { $resourceKey = 'https://d13l49jEXAMPLE.cloudfront.net/my-file.txt'; $expires = time() + 300; // 5 minutes (5 * 60 seconds) from now. $customPolicy = <<<POLICY { "Statement": [ { "Resource": "$resourceKey", "Condition": { "IpAddress": {"AWS:SourceIp": "{$_SERVER['REMOTE_ADDR']}/32"}, "DateLessThan": {"AWS:EpochTime": $expires} } } ] } POLICY; $privateKey = dirname(__DIR__) . '/cloudfront/my-private-key.pem'; $keyPairId = 'AAPKAJIKZATYYYEXAMPLE'; $cloudFrontClient = new CloudFrontClient([ 'profile' => 'default', 'version' => '2018-06-18', 'region' => 'us-east-1' ]); echo signPrivateDistributionPolicy( $cloudFrontClient, $resourceKey, $customPolicy, $privateKey, $keyPairId ); } // Uncomment the following line to run this code in an AWS account. // signAPrivateDistributionPolicy();
Uso de una URL firmada por CloudFront
El formato de la URL firmada depende de si la URL que se está firmando utiliza el esquema "HTTP" o "RTMP". En el caso de "HTTP", se devuelve la URL absoluta completa. Para "RTMP" solo se devuelve la URL relativa para mayor comodidad. Esto se debe a que algunos reproductores requieren que el host y la ruta se indiquen como parámetros independientes.
El siguiente ejemplo muestra cómo puede utilizar la URL firmada para construir una página web que muestra un vídeo mediante JWPlayer
<html> <head> <title>|CFlong| Streaming Example</title> <script type="text/javascript" src="https://example.com/jwplayer.js"></script> </head> <body> <div id="video">The canned policy video will be here.</div> <script type="text/javascript"> jwplayer('video').setup({ file: "<?= $streamHostUrl ?>/cfx/st/<?= $signedUrlCannedPolicy ?>", width: "720", height: "480" }); </script> </body> </html>
Firma de cookies de CloudFront para distribuciones privadas
Como alternativa a las URL firmadas, también puede conceder a los clientes acceso a una distribución privada mediante cookies firmadas. Las cookies firmadas permiten ofrecer acceso a múltiples archivos restringidos, por ejemplo a todos los archivos de vídeo en formato HLS, o a todos los archivos del área de suscriptores de un sitio web. Para obtener más información sobre las razones para preferir cookies firmadas en lugar de URL firmadas (o viceversa), consulte Elegir entre URL firmadas y cookies firmadas en la Guía para desarrolladores de Amazon CloudFront.
Crear una cookie firmada es similar a crear una URL firmada. La única diferencia es el método al que se llama (getSignedCookie en lugar de getSignedUrl).
Importaciones
require 'vendor/autoload.php'; use Aws\CloudFront\CloudFrontClient; use Aws\Exception\AwsException;
Código de muestra
function signCookie( $cloudFrontClient, $resourceKey, $expires, $privateKey, $keyPairId ) { try { $result = $cloudFrontClient->getSignedCookie([ 'url' => $resourceKey, 'expires' => $expires, 'private_key' => $privateKey, 'key_pair_id' => $keyPairId ]); return $result; } catch (AwsException $e) { return [ 'Error' => $e->getAwsErrorMessage() ]; } } function signACookie() { $resourceKey = 'https://d13l49jEXAMPLE.cloudfront.net/my-file.txt'; $expires = time() + 300; // 5 minutes (5 * 60 seconds) from now. $privateKey = dirname(__DIR__) . '/cloudfront/my-private-key.pem'; $keyPairId = 'AAPKAJIKZATYYYEXAMPLE'; $cloudFrontClient = new CloudFrontClient([ 'profile' => 'default', 'version' => '2018-06-18', 'region' => 'us-east-1' ]); $result = signCookie( $cloudFrontClient, $resourceKey, $expires, $privateKey, $keyPairId ); /* If successful, returns something like: CloudFront-Expires = 1589926678 CloudFront-Signature = Lv1DyC2q...2HPXaQ__ CloudFront-Key-Pair-Id = AAPKAJIKZATYYYEXAMPLE */ foreach ($result as $key => $value) { echo $key . ' = ' . $value . "\n"; } } // Uncomment the following line to run this code in an AWS account. // signACookie();
Uso de una política personalizada al crear direcciones cookies de CloudFront
Al igual que con getSignedUrl, puede especificar un parámetro 'policy' en lugar de un parámetro expires y un parámetro url para firmar una cookie con una política personalizada. La política personalizada puede contener comodines en la clave de recurso. Esto le permite crear una sola cookie firmada para varios archivos.
getSignedCookie devuelve una matriz de pares clave-valor, que deben configurarse como cookies en su totalidad para obtener acceso a una distribución privada.
Importaciones
require 'vendor/autoload.php'; use Aws\CloudFront\CloudFrontClient; use Aws\Exception\AwsException;
Código de muestra
function signCookiePolicy( $cloudFrontClient, $customPolicy, $privateKey, $keyPairId ) { try { $result = $cloudFrontClient->getSignedCookie([ 'policy' => $customPolicy, 'private_key' => $privateKey, 'key_pair_id' => $keyPairId ]); return $result; } catch (AwsException $e) { return [ 'Error' => $e->getAwsErrorMessage() ]; } } function signACookiePolicy() { $resourceKey = 'https://d13l49jEXAMPLE.cloudfront.net/my-file.txt'; $expires = time() + 300; // 5 minutes (5 * 60 seconds) from now. $customPolicy = <<<POLICY { "Statement": [ { "Resource": "{$resourceKey}", "Condition": { "IpAddress": {"AWS:SourceIp": "{$_SERVER['REMOTE_ADDR']}/32"}, "DateLessThan": {"AWS:EpochTime": {$expires}} } } ] } POLICY; $privateKey = dirname(__DIR__) . '/cloudfront/my-private-key.pem'; $keyPairId = 'AAPKAJIKZATYYYEXAMPLE'; $cloudFrontClient = new CloudFrontClient([ 'profile' => 'default', 'version' => '2018-06-18', 'region' => 'us-east-1' ]); $result = signCookiePolicy( $cloudFrontClient, $customPolicy, $privateKey, $keyPairId ); /* If successful, returns something like: CloudFront-Policy = eyJTdGF0...fX19XX0_ CloudFront-Signature = RowqEQWZ...N8vetw__ CloudFront-Key-Pair-Id = AAPKAJIKZATYYYEXAMPLE */ foreach ($result as $key => $value) { echo $key . ' = ' . $value . "\n"; } } // Uncomment the following line to run this code in an AWS account. // signACookiePolicy();
Envío de cookies de CloudFront al cliente Guzzle
También puede pasar estas cookies a una GuzzleHttp\Cookie\CookieJar para su uso con un cliente Guzzle.
use GuzzleHttp\Client; use GuzzleHttp\Cookie\CookieJar; $distribution = "example-distribution.cloudfront.net"; $client = new \GuzzleHttp\Client([ 'base_uri' => "https://$distribution", 'cookies' => CookieJar::fromArray($signedCookieCustomPolicy, $distribution), ]); $client->get('video.mp4');
Para obtener más información, consulte Uso de cookies firmadas en la Guía para desarrolladores de Amazon CloudFront.