Signature des CloudFront URL Amazon avec la AWS SDK for PHP version 3 - AWS SDK for PHP

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.

Signature des CloudFront URL Amazon avec la AWS SDK for PHP version 3

Les URL signées vous permettent de fournir aux utilisateurs l'accès à votre contenu privé. Une URL signée inclut des informations supplémentaires (par exemple, une heure d'expiration) qui vous permettent de mieux contrôler l'accès à votre contenu. Ces informations supplémentaires apparaissent dans une déclaration de politique, basée sur une politique prédéfinie ou une politique personnalisée. Pour plus d'informations sur la façon de configurer des distributions privées et sur les raisons pour lesquelles vous devez signer des URL, consultez la section Diffuser du contenu privé via Amazon CloudFront dans le guide du CloudFront développeur Amazon.

  • Créez une CloudFront URL Amazon signée à l'aide de GetSignedURL.

  • Créez un CloudFront cookie Amazon signé à l'aide de getSignedCookie.

Tous les exemples de code pour le AWS SDK for PHP sont disponibles ici GitHub.

Informations d’identification

Avant d'exécuter l'exemple de code, configurez vos AWS informations d'identification, comme décrit dansInformations d'identification. Importez ensuite leAWS SDK for PHP, comme décrit dansUtilisation de base.

Pour plus d'informations sur l'utilisation d'Amazon CloudFront, consultez le manuel du CloudFront développeur Amazon.

CloudFront URL de signature pour les distributions privées

Vous pouvez signer une URL à l'aide du CloudFront client dans le SDK. Tout d'abord, vous devez créer un objet CloudFrontClient. Vous pouvez signer CloudFront l'URL d'une ressource vidéo à l'aide d'une politique prédéfinie ou personnalisée.

Importations

require 'vendor/autoload.php'; use Aws\CloudFront\CloudFrontClient; use Aws\Exception\AwsException;

Exemple de code

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

Utiliser une politique personnalisée lors de la création d' CloudFront URL

Pour utiliser une stratégie personnalisée, fournissez la clé policy à la place de expires.

Importations

require 'vendor/autoload.php'; use Aws\CloudFront\CloudFrontClient; use Aws\Exception\AwsException;

Exemple de code

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

Utiliser une URL CloudFront signée

La forme de l'URL signée diffère selon que l'URL que vous signez utilise le schéma « HTTP » ou « RTMP ». Dans le cas du schéma « HTTP », l'intégralité de l'URL absolue est renvoyée. Dans le cas du schéma « RTMP », seule l'URL relative est renvoyée pour simplifier le processus. Cela est dû au fait que certains lecteurs exigent que l'hôte et le chemin soient fournis en tant que paramètres séparés.

L’exemple suivant montre comment utiliser l’URL signée pour construire une page Web affichant une vidéo à l’aide de JWPlayer. Le même type de technique s'appliquerait aux autres joueurs, par exemple FlowPlayer, mais nécessiterait un code différent côté client.

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

CloudFront Cookies de signature pour les distributions privées

Au lieu d'utiliser des URL signées, vous pouvez également fournir aux clients l'accès à une distribution privée via des cookies signés. Les cookies signés vous permettent de fournir l'accès à plusieurs fichiers restreints : par exemple, tous les fichiers d'une vidéo au format HLS ou tous les fichiers de la section des abonnés d'un site web. Pour plus d'informations sur les raisons pour lesquelles vous souhaiterez peut-être utiliser des cookies signés au lieu d'URL signées (ou vice versa), consultez Choisir entre des URL signées et des cookies signés dans le manuel Amazon CloudFront Developer Guide.

La création d'un cookie signé est similaire à celle d'une URL signée. La seule différence est la méthode appelée (getSignedCookie au lieu de getSignedUrl).

Importations

require 'vendor/autoload.php'; use Aws\CloudFront\CloudFrontClient; use Aws\Exception\AwsException;

Exemple de code

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

Utiliser une politique personnalisée lors de la création de CloudFront cookies

Comme avec getSignedUrl, vous pouvez fournir un paramètre 'policy' à la place d'un paramètre expires et d'un paramètre url pour signer un cookie avec une stratégie personnalisée. Une stratégie personnalisée peut contenir des caractères génériques dans la ressource clé. Cela vous permet de créer un seul cookie signé pour plusieurs fichiers.

getSignedCookie renvoie un tableau de paires clé-valeur. Toutes ces paires doivent être définies comme des cookies pour accorder l'accès à une distribution privée.

Importations

require 'vendor/autoload.php'; use Aws\CloudFront\CloudFrontClient; use Aws\Exception\AwsException;

Exemple de code

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

Envoyer CloudFront des cookies au client Guzzle

Vous pouvez également transmettre ces cookies à un GuzzleHttp\Cookie\CookieJar pour une utilisation avec un client 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');

Pour plus d'informations, consultez la section Utilisation de cookies signés dans le manuel Amazon CloudFront Developer Guide.