使用Clojure的Amazonica创建S3签名的URL时如何指定ACL策略?

时间:2018-11-20 23:36:29

标签: amazon-s3 clojure amazonica

我正在尝试使上传的ACL为public-readAmazonica的文档非常薄,经过数小时的修补,我还无法弄清楚如何实现这一目标。简而言之,我无法弄清楚如何使它在标头上签名。

服务器端,我的代码如下所示。

(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并执行XHR PUT请求

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

除了它的ACL错误:“私有”而不是“公开”之外,这非常有效。

在客户端添加它很容易

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 :(得分:0)

我没有直接的答案,但是您可以考虑一种解决方法:将s3存储桶中的所有对象默认设置为公开读取。

您可以通过将此存储桶策略添加到存储桶中来实现此目的(当然替换bucketnm):

{
  "Id": "Policy1397632521960",
  "Statement": [
    {
      "Sid": "Stmt1397633323327",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::bucketnm/*",
      "Principal": {
        "AWS": [
          "*"
        ]
      }
    }
  ]
}