本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 适用于 PHP 的 AWS SDK 版本 3 来针对 Amazon CloudFront URL 签名
您可通过签名 URL 为用户提供对私有内容的访问权限。签名 URL 中包含的其他信息(例如,到期时间)可让您更好地控制对内容的访问。该额外信息出现在策略声明中,且是基于标准策略或自定义策略。有关如何设置私有分配,以及为什么需要针对 URL 签名的信息,请参阅 Amazon CloudFront 开发人员指南中的通过 Amazon CloudFront 提供私有内容。
-
使用 getSignedURL 创建已签名的 Amazon CloudFront URL。
-
使用 getSignedCookie 创建已签名的 Amazon CloudFront Cookie。
适用于 PHP 的 AWS SDKGitHub 上提供了
凭证
运行示例代码之前,请配置您的 AWS 凭证,如 AWS 使用 适用于 PHP 的 AWS SDK 版本 3 进行身份验证 中所述。然后导入 适用于 PHP 的 AWS SDK,如 安装适用于 PHP 的 AWS SDK 版本 3 中所述。
有关使用 Amazon CloudFront 的更多信息,请参阅 Amazon CloudFront 开发人员指南。
针对 CloudFront URL 签名,用于私有分配。
可以使用 SDK 中的 CloudFront 客户端来针对 URL 签名。首先,您必须创建一个 CloudFrontClient 对象。可以使用标准策略或自定义策略针对视频资源的 CloudFront URL 签名。
导入。
require 'vendor/autoload.php'; use Aws\CloudFront\CloudFrontClient; use Aws\Exception\AwsException;
示例代码
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();
创建 CloudFront URL 时使用自定义策略
要使用自定义策略,请提供 policy 键,而不是 expires。
导入。
require 'vendor/autoload.php'; use Aws\CloudFront\CloudFrontClient; use Aws\Exception\AwsException;
示例代码
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();
使用 CloudFront 签名 URL
根据您要签名的 URL 使用的是“HTTP”还是“RTMP”方案,签名后的 URL 的形式将有所不同。如果是“HTTP”方案,将返回完整的绝对 URL。如果是“RTMP”方案,则为了方便起见,只会返回相对 URL。这是因为某些播放器要求分别提供主机和路径参数。
以下示例展示如何使用签名 URL 构造网页,以使用 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>
针对 CloudFront Cookie 签名,用于私有分配
作为签名 URL 的替代方案,您还可以通过签名 Cookie 为客户端授予对私有分发的访问权限。借助经过签名的 Cookie,您可以提供对多个受限文件的访问权限,例如 HLS 格式视频的所有文件,或在网站订阅者区域中的所有文件。有关为什么要使用签名 Cookie 而不使用签名 URL(或相反情况)的更多信息,请参阅 Amazon CloudFront 开发人员指南中的选择签名 URL 或签名 Cookie。
创建签名 cookie 的方法与创建签名 URL 的方法类似。唯一的区别是调用的方法(getSignedCookie,而不是 getSignedUrl)。
导入。
require 'vendor/autoload.php'; use Aws\CloudFront\CloudFrontClient; use Aws\Exception\AwsException;
示例代码
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();
创建 CloudFront Cookie 时使用自定义策略
与 getSignedUrl 相同,您可以提供 'policy' 参数(而不是 expires 参数),以及 url 参数,使用自定义策略针对 Cookie 签名。自定义策略可以在资源键中包含通配符。这样您就可以为多个文件创建一个签名 Cookie。
getSignedCookie 返回的键值对数组均需设置为 Cookie,这样才能为私有分配授予访问权限。
导入。
require 'vendor/autoload.php'; use Aws\CloudFront\CloudFrontClient; use Aws\Exception\AwsException;
示例代码
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();
将 CloudFront Cookie 发送到 Guzzle 客户端
您也可以将这些 Cookie 传递至 GuzzleHttp\Cookie\CookieJar,与 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');
有关更多信息,请参阅 Amazon CloudFront 开发人员指南中的使用签名 Cookie。