我的s3存储桶中有一个名为private
的文件夹,该文件夹中的内容只能由授权用户访问(即禁用公共读取访问权限)。
所以我生成了用于访问该文件夹中某个对象的sigened url,它工作正常。
以下是签名的网址格式
s3-<region>.amazonaws.com/<folder>/<imagename>??X-Amz-Content-Sha256=.......
此外,我还为上述s3存储桶创建了云端分发,以获得更好的性能。
这是云端网址xxxxjjjj.cloudfront.net
那么我如何使用此云端分发服务我的签名网址?
当我尝试使用此网址时
xxxxjjjj.cloudfront.net/<folder>/<imagename>??X-Amz-Content-Sha256=.......
我将获得访问被拒绝错误,我认为这不是通过cloudfront发布方式提供s3签名网址内容的正确方法。
使用php laravel框架
答案 0 :(得分:5)
CloudFront的签名URL使用与S3的签名URL不同的格式和不同的凭据。
阅读Serving Private Content through CloudFront。
GitHub上有laravel-url-signer,您也可以从this example in the CloudFront docs编写自己的代码。
要测试您的CloudFront和S3设置,您可以使用aws-cli中的aws cloudfront sign ...
生成测试签名网址。
答案 1 :(得分: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;
}
P.S。我在aws示例中发现了一个错误,因为他们使用$ resourceKey作为策略中的Resource值而不是woking,对我有用的是使用文件的完整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;