Подписанный URL-адрес AWS Cloudfront с неподписанными параметрами запроса - PullRequest
1 голос
/ 10 марта 2019

Я пытаюсь разместить изображения на s3 с помощью cloudfront, но я хочу, чтобы клиент выбирал размер изображения при выполнении запроса изображения с использованием параметров запроса.

Я хочу использовать подписанные URL-адреса, поэтому, если у пользователя есть подписанный URL-адрес, он может получить доступ к этому изображению в любом размере. Проблема в том, что параметры запроса размера изображения должны быть добавлены к URL во время подписания, в противном случае добавление параметров запроса размера приведет к тому, что проверка подписи не пройдет. Это означает, что если я хочу, чтобы изображение было двух разных размеров, мне нужно сделать два обхода на моем сервере, чтобы подписать URL-адрес с параметрами размера, а затем получить изображения из облачного фронта. Я хочу избежать этого.

Есть ли способ, которым я мог бы сделать это?

1 Ответ

0 голосов
/ 10 марта 2019

Sovled! Спасибо @Michael - sqlbot. Используя пользовательскую политику, я могу вернуть любые размеры изображения, которые я хочу, включая исходный размер, используя один URL-адрес со знаком. Если у кого-то еще есть эта проблема, вот как я это сделал:

Мой php-код для генерации подписанного URL:

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.net / для моего дистрибутива облачного фронта, а $ resource - имя файла (например, my_profile_image.png)

В этот момент я получаю свое подписанное изображение и затем могу изменить параметры запроса w и h на клиенте в соответствии с содержанием моего сердца. Моя лямбда-функция запускается по событию Cloudfront ViewerRequest и будет указывать Cloudfront загружать либо изображение с указанными размерами, либо загружать исходное изображение, если w и h оба *.

...