带有未签名查询参数的AWS Cloudfront签名网址

时间:2019-03-10 03:17:50

标签: amazon-web-services amazon-s3 amazon-cloudfront

我正在尝试使用Cloudfront在s3上托管图像,但是我希望客户端在使用查询参数发出图像请求时选择图像的大小。

我想使用签名的url,因此,如果用户具有签名的url,则他们可以访问所需大小的图像。问题是,在签名期间必须将图像大小查询参数附加到url上,否则附加大小查询参数将导致签名检查不通过。这意味着如果我希望图像具有两种不同的大小,则需要两次往返于服务器以使用size参数对URL进行签名,然后从cloudfront获取图像。我想避免这种情况。

有什么办法可以做到这一点?

2 个答案:

答案 0 :(得分:0)

已解决!感谢@Michael-sqlbot。通过使用自定义策略,我可以使用一个签名的URL返回任何想要的图像尺寸,包括原始尺寸。如果其他人遇到此问题,请按以下步骤操作:

我的用于生成签名URL的php代码:

public static function signedImageUrl($resource)
{

    // Build Url
    $url = self::CLOUDFRONT_BASE . ltrim($resource, '/') . '?w=*&h=*';

    // Create a CloudFront Client
    $client = new CloudFrontClient([
        'version' => '2014-11-06',
        'region' => 'us-east-2'
    ]);

    // Set up parameter values for the resource
    $expires = time() + 300;

    // Policy
    $policy = '{ 
    "Statement": [
        { 
            "Resource":"' . $url . '",
            "Condition":{ 
                "DateLessThan":{"AWS:EpochTime":' . $expires . '}
            } 
        }
    ] 
    }';

    // Create a signed URL for the resource using the canned policy
    $signedUrlCannedPolicy = $client->getSignedUrl([
        'url' => $url,
        'policy' => $policy,
        'private_key' => env('AWS_CLOUDFRONT_PRIVATE_KEY_PATH'),
        'key_pair_id' => env('AWS_CLOUDFRONT_KEY_PAIR_ID')
    ]);

    return $signedUrlCannedPolicy;
}

其中CLOUDFRONT_BASE是我的Cloudfront发行版的.cloudfront.net /域,而$ resource是文件名(例如my_profile_image.png)

这时,我得到了签名的图像,然后可以将客户端上的w和h查询参数修改为我喜欢的内容。我的lambda函数在cloudfront ViewerRequest事件上触发,它将指示cloudfront加载具有指定尺寸的图像,或者如果w和h均为*,则加载原始图像。

答案 1 :(得分:0)

您还可以在路径的末尾添加星号(例如HashSet<T>),以允许添加其他可选参数。