Как указать политику ACL при создании подписанного URL-адреса S3 с Amazonica Clojure? - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь сделать загрузку с ACL public-read.Документы очень тонкие для Amazonica , и после нескольких часов работы я не приблизился к тому, чтобы выяснить, как достичь этой цели.Короче говоря, я не могу понять, как заставить его подписать заголовок.

На стороне сервера мой код выглядит следующим образом.

(s3/generate-presigned-url 
  creds
  {:bucket-name          "mybucket"
   :method               "PUT"
   :expires              10000
   :key                  "my-key"
   :cache-control        "max-age=31557600;"
   :request-parameters {:x-amz-acl "public-read"}
   })

На стороне клиента я беру URL, который создает и выполняет запрос PUT XHR

var xhr = new XMLHttpRequest();
    xhr.open("PUT", signedUrl);
    xhr.setRequestHeader('Cache-Control', 'max-age=31557600')
    xhr.onload = ...
    xhr.onerror = ...
xhr.send(file);

И это работает отлично, за исключением того, что он имеет неправильный ACL: "private"вместо" public "

Добавить его на стороне клиента легко

var xhr = new XMLHttpRequest();
    xhr.open("PUT", signedUrl);
    xhr.setRequestHeader('Cache-Control', 'max-age=31557600')
    xhr.setRequestHeader('x-amz-acl', 'public-read')
    xhr.onload = ...
    xhr.onerror = ...
xhr.send(file);

Но запрос, конечно, не выполняется из-за HeadersNotSigned.Я вообще не могу понять, как добавить это на стороне сервера, чтобы они были подписаны.Раздел SignedHeaders никогда не содержит никаких дополнительных параметров.

Я слепо перепробовал всевозможные комбинации

(s3/generate-presigned-url 
  creds
  {:headers              {:x-amz-acl "public-read"}
   :x-amz-acl            "public-read"
   :metadata             {:x-amz-acl "public-read"}
   :signed-headers       {:x-amz-acl "public-read"}
   :amz-acl "public-read"
   :x-amz-signed-headers {:x-amz-acl "public-read"}
   :X-Amz-SignedHeaders ["x-amz-acl"]
   :request-parameters {:x-amz-acl "public-read"}
   })

Как добавить политику ACL в подписанный URL-адрес?

1 Ответ

0 голосов
/ 21 ноября 2018

У меня нет прямого ответа на этот вопрос, но вы можете обойти это решение: сделать все объекты в вашей корзине s3 по умолчанию открытыми для чтения.

Вы можете сделать это, добавив эту политику корзины вваше ведро (замените bucketnm конечно):

{
  "Id": "Policy1397632521960",
  "Statement": [
    {
      "Sid": "Stmt1397633323327",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::bucketnm/*",
      "Principal": {
        "AWS": [
          "*"
        ]
      }
    }
  ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...