适用于 PHP 的 AWS 开发工具包
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用AWS SDK for PHP版本 3 对 Amazon CloudFront URL 进行签名

您可通过签名 URL 为用户提供对私有内容的访问权限。签名 URL 中包含的其他信息(例如,到期时间)可让您更好地控制对内容的访问。此类其他信息出现在策略声明中,且基于固定策略或自定义策略。有关如何设置私有分配,以及为什么需要对 URL 进行签名的信息,请参阅 Amazon CloudFront Developer Guide 中的通过 Amazon CloudFront 提供私有内容

  • 使用 getSignedURL 创建已签名的 Amazon CloudFront URL。

  • 使用 getSignedCookie 创建已签名的 Amazon CloudFront Cookie。

GitHub 上的此处提供了AWS SDK for PHP版本 3 的所有示例代码。

凭证

在运行示例代码之前,您需要配置 AWS 凭证,如适用于 PHP 的 AWS 开发工具包版本 3 的凭证中所述。然后导入AWS SDK for PHP,如适用于 PHP 的 AWS 开发工具包版本 3 的基本使用模式中所述。

有关使用 Amazon CloudFront 的更多信息,请参阅 Amazon CloudFront 开发人员指南

针对 CloudFront URL 签名,用于私有分配。

您可以使用开发工具包中的 CloudFront 客户端针对 URL 进行签名。首先,您必须创建一个 CloudFrontClient 对象。您可以使用标准策略或自定义策略针对视频资源的 CloudFront URL 进行签名。

导入

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

示例代码

// Create a CloudFront Client $client = new Aws\CloudFront\CloudFrontClient([ 'profile' => 'default', 'version' => '2014-11-06', 'region' => 'us-east-2' ]); // Set up parameter values for the resource $resourceKey = 'rtmp://example-distribution.cloudfront.net/videos/example.mp4'; $expires = time() + 300; // Create a signed URL for the resource using the canned policy $signedUrlCannedPolicy = $client->getSignedUrl([ 'url' => $resourceKey, 'expires' => $expires, 'private_key' => '/path/to/your/cloudfront-private-key.pem', 'key_pair_id' => '<CloudFront key pair id>' ]);

创建 CloudFront URL 时使用自定义策略

要使用自定义策略,请提供 policy 键,而不是 expires

导入

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

示例代码

// Create a CloudFront Client $client = new Aws\CloudFront\CloudFrontClient([ 'profile' => 'default', 'version' => '2014-11-06', 'region' => 'us-east-2' ]); // Set up parameter values for the resource $customPolicy = <<<POLICY { "Statement": [ { "Resource": "{$resourceKey}", "Condition": { "IpAddress": {"AWS:SourceIp": "{$_SERVER['REMOTE_ADDR']}/32"}, "DateLessThan": {"AWS:EpochTime": {$expires}} } } ] } POLICY; $resourceKey = 'rtmp://example-distribution.cloudfront.net/videos/example.mp4'; // Create a signed URL for the resource using the canned policy $signedUrlCannedPolicy = $client->getSignedUrl([ 'url' => $resourceKey, 'policy' => $customPolicy, 'private_key' => '/path/to/your/cloudfront-private-key.pem', 'key_pair_id' => '<CloudFront key pair id>' ]); foreach ($signedUrlCannedPolicy as $name => $value) { setcookie($name, $value, 0, "", "example-distribution.cloudfront.net", true, true); }

使用 CloudFront 签名 URL

根据您要签名的 URL 是使用“HTTP”还是使用“RTMP”方案,签名 URL 的形式是不同的。如果是“HTTP”方案,将返回完整的绝对 URL。对于“RTMP”方案,将只返回相对 URL,以便于您的使用。这是因为某些播放器要求分别提供主机和路径参数。

以下示例展示如何使用签名 URL 构造网页,以使用 JWPlayer 显示视频。同类技术还可应用于其他播放器,例如 FlowPlayer,但需要其他客户端代码。

<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 格式视频的所有文件,或在网站的订阅者区域中的所有文件。有关为什么要使用签名 Cookies 而不使用签名 URL(或相反情况)的更多信息,请参阅 Amazon CloudFront Developer Guide 中的选择签名 URL 或签名 Cookie

创建签名 Cookie 的方法与创建签名 URL 的方法类似。唯一的区别是调用的方法(getSignedCookie,而不是 getSignedUrl)。

导入

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

示例代码

// Create a CloudFront Client $client = new Aws\CloudFront\CloudFrontClient([ 'profile' => 'default', 'version' => '2014-11-06', 'region' => 'us-east-2' ]); // Set up parameter values for the resource $resourceKey = 'https://example-distribution.cloudfront.net/videos/example.mp4'; $expires = time() + 300; // Create a signed cookie for the resource using the canned policy $signedCookieCannedPolicy = $client->getSignedCookie([ 'url' => $resourceKey, 'expires' => $expires, 'private_key' => '/path/to/your/cloudfront-private-key.pem', 'key_pair_id' => '<CloudFront key pair id>' ]);

创建 CloudFront Cookie 时使用自定义策略

getSignedUrl 相同,您可以提供 'policy' 参数(而不是 expires 参数),以及 url 参数,使用自定义策略针对 Cookie 签名。自定义策略可以在资源键中包含通配符。这样您就可以为多个文件创建一个签名 Cookie。

getSignedCookie 返回的键值对数组均需设置为 Cookie,这样才能为私有分配授予访问权限。

导入

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

示例代码

// Create a CloudFront Client $client = new Aws\CloudFront\CloudFrontClient([ 'profile' => 'default', 'version' => '2014-11-06', 'region' => 'us-east-2' ]); // Set up parameter values for the resource $resourceKey = 'https://example-distribution.cloudfront.net/videos/example.mp4'; $customPolicy = <<<POLICY { "Statement": [ { "Resource": "{$resourceKey}", "Condition": { "IpAddress": {"AWS:SourceIp": "{$_SERVER['REMOTE_ADDR']}/32"}, "DateLessThan": {"AWS:EpochTime": {$expires}} } } ] } POLICY; // Create a signed cookie for the resource using a custom policy $signedCookieCustomPolicy = $client->getSignedCookie([ 'policy' => $customPolicy, 'private_key' => '/path/to/your/cloudfront-private-key.pem', 'key_pair_id' => '<CloudFront key pair id>' ]); foreach ($signedCookieCustomPolicy as $name => $value) { setcookie($name, $value, 0, "", "example-distribution.cloudfront.net", true, true); }

将 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 Developer Guide 中的使用签名 Cookie