Отказ в доступе к загрузке AWS S3 через предварительно подписанное сообщение, созданное с помощью AWS-SDK PHP - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь загрузить файл (изображение для моих тестов) в мою корзину s3 с предварительно подписанным постом, созданным с помощью AWS SDK PHP. Во-первых, я генерирую предварительно подписанное сообщение, затем вручную создаю запрос с данными PostObjectV4 с помощью Postman или через простую HTML-форму ... Заполнив все, результат запроса в Access Denied :-(. Пользователь, связанный с клиентом для создания PostObjectV4, имеет разрешенную политику s3: PutObject в соответствующем сегменте.

Я уже пытался:

  • Установите мое ведро как публичную запись, и это работает! Это указывает на проблему разрешения / политики ... К сожалению, мое ведро не должно быть общедоступным ...
  • Загрузить файл через командную строку aws, он тоже работает

PHP-код предварительно подписанной публикации (данные находятся в $ postObject):

$assetAwsS3Key = $this->getAssetAwsS3Key($asset);

$options = [
    ['starts-with', '$key', 'myDir/'],
];

// Optional: configure expiration time string
$expires = '+24 hours';

// Set some defaults for form input fields
$formInputs = ['acl' => 'private'];

$postObject = new PostObjectV4(
    $this->buildAwsS3UserClient(),
    $this->awsBucketName,
    $formInputs,
    $options,
    $expires
);

// Get attributes to set on an HTML form, e.g., action, method, enctype
$formAttributes = $postObject->getFormAttributes();

// Get form input fields. This will include anything set as a form input in
// the constructor, the provided JSON policy, your AWS access key ID, and an
// auth signature.
$formInputs = $postObject->getFormInputs();

return ['formAttributes' => $formAttributes, 'formInputs' => $formInputs];

Политика моего пользователя (используется для генерации клиента):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::awsBucketName/*"
            ]
        }
    ]
}

Моя простая HTML-форма для загрузки теста:

<form method="post" action="https://my-bucket.s3.eu-west-3.amazonaws.com" enctype="multipart/form-data">
        <input type="hidden" name="key" value="myKey/sources/myImg.jpg" /><br />
        <input type="file"   name="file" /> <br />
        <input type="hidden" name="X-Amz-Credential" value="MYUSERACCESSKEY/20190510/eu-west-3/s3/aws4_request" />
        <input type="hidden" name="X-Amz-Algorithm" value="AWS4-HMAC-SHA256" /> 
        <input type="hidden" name="X-Amz-Date" value="20190510T132109Z" />
        <input type="hidden" name="Policy" value='MYBASE64ENCODEDPOLICY' />
        <input type="hidden" name="X-Amz-Signature" value="MYSIGNATURE" />
        <input type="submit" name="submit"/>
    </form>

Есть ли у вас идея / подсказка, почему эта загрузка не удалась, когда корзина не является общедоступным доступом для записи?

Заранее большое спасибо!

...