2017-02-16 147 views
0

我的s3存储桶中有一个名为private的文件夹,并且该文件夹中的内容仅由授权用户访问(即禁用公共读取访问权限)。配置AWS cloudfront以从s3存储桶中提供签名url

所以我生成sigened url的访问该文件夹中的对象之一,它工作正常。

这里是标识的URL格式

s3-<region>.amazonaws.com/<folder>/<imagename>??X-Amz-Content-Sha256=....... 

对于上述S3存储有更好的表现我也有创建CloudFront的分布。 这里是云端的地址xxxxjjjj.cloudfront.net

那么,我该如何服务我的签署的网址与这个云端分布?

当我与这个网址

xxxxjjjj.cloudfront.net/<folder>/<imagename>??X-Amz-Content-Sha256=.......

我会得到拒绝访问错误尝试,我认为这是不提供的S3正道签署了URL内容与CloudFront的分布。

使用PHP laravel框架

回答

1

为CloudFront的签名网址中使用不同的格式和不同的凭据比S3签署的网址。

阅读Serving Private Content through CloudFront

GitHub上有一个laravel-url-signer或者您可以编写自己的代码从this example in the CloudFront docs

要测试您的CloudFront和S3设置,可以在aws-cli中使用aws cloudfront sign ...生成测试签名的URL。

+0

我已经生成标识的URL的使用PHP SDK,但是当我底座部分,即('S3- .amazonaws.com'替换为'hhsdjf.cloudfront.net')它的访问被拒绝错误 – Jabaa

+0

更改URL的主机组件并不是如何工作的。 CloudFront签名的URL *完全*不同,由不同的代码生成,并且在查询字符串中包含'&Key-Pair-Id = ...' - 它们不使用“X-Amz-Credential”并且不使用AWSAccessKeyId '。 –

0

有你在这个环节https://docs.aws.amazon.com/aws-sdk-php/v3/guide/service/cloudfront-signed-url.html

使用PHP SDK问什么的例子,这里是在Larave使用自定义策略的等效代码(5.3):

public static function signedUrl($resourceKey) { 
    //$resourceKey = 'videos/example.mp4' 
    $baseUrl = 'https://xxxxjjjj.cloudfront.net'; 
    $fullUrl = $baseUrl . '/' . $resourceKey; 
    $expires = time() + 300; 
    $customSigningPolicy = <<<POLICY 
{ 
    "Statement": [ 
     { 
      "Resource": "{$fullUrl}", 
      "Condition": { 
       "DateLessThan": {"AWS:EpochTime": {$expires}} 
      } 
     } 
    ] 
} 
POLICY; 

    // CloudFront Signed Urls 
    /** @var CloudFrontClient $cloudFront */ 
    $cloudFront = \AWS::createClient('CloudFront'); 
    $url = $cloudFront->getSignedUrl([ 
     'url' => $fullUrl, 
     'policy' => $customSigningPolicy, 
     'key_pair_id' => 'YOUR_KEY_PAIR_ID', 
     'private_key' => '/path/to/your/cloudfront-private-key.pem' 
    ]); 

    return $url; 
} 

附:我在aws示例中发现了一个错误,因为他们在不打扰的策略中使用$ resourceKey作为Resource值,与我一起工作的是使用该文件的完整url。

其代码:

$resourceKey = 'videos/example.mp4'; 
$customPolicy = <<<POLICY 
{ 
    "Statement": [ 
     { 
      "Resource": "{$resourceKey}", 
      "Condition": { 
       "IpAddress": {"AWS:SourceIp": "{$_SERVER['REMOTE_ADDR']}/32"}, 
       "DateLessThan": {"AWS:EpochTime": {$expires}} 
      } 
     } 
    ] 
} 
POLICY; 

什么工作:

$resourceKey = 'videos/example.mp4'; // or $resourceKey = 'videos/*'; or $resourceKey = '*'; 
$fullUrl = $baseUrl . '/' . $resourceKey; 
$customPolicy = <<<POLICY 
{ 
    "Statement": [ 
     { 
      "Resource": "{$fullUrl}", 
      "Condition": { 
       "IpAddress": {"AWS:SourceIp": "{$_SERVER['REMOTE_ADDR']}/32"}, 
       "DateLessThan": {"AWS:EpochTime": {$expires}} 
      } 
     } 
    ] 
} 
POLICY;