我正在尝试通过CloudFront签署一个上传到S3的网址。
如果我使用政策签署网址:
https://staging.*SNIP*.io/341-a25e82ef-8210-49bc-9fbd-b3f0c4807080-original.jpg?Policy=*SNIP*&Signature=*SNIP*&Key-Pair-Id=*SNIP*
或没有政策但使用过期
https://staging.*SNIP*.io/343-aa3e9a57-4d85-4c90-bf05-3d6fdac04a49-original.jpg?Expires=1457765627&Signature=*SNIP*&Key-Pair-Id=*SNIP*
我的一致性得到:
<Error>
<Code>AccessDenied</Code>
<Message>Query-string authentication requires the Signature, Expires and AWSAccessKeyId parameters</Message>
<RequestId>*snip*</RequestId>
<HostId>*snip*</HostId>
</Error>
我根据各种不同的SO答案推出了自己的签名。我尝试过使用AWS SDK内置的签名。我已经销毁并重新创建了CloudFront发行版。
我已经完全没有想法了。
我可能已经在SO上查看了有关使用cloudfront签名的网址的所有问题,但没有任何帮助。我无法理解403错误。
编辑:似乎AWS不知道它为什么不起作用,它似乎都配置正确。
答案 0 :(得分:0)
我设法解决了这个问题。文档(在撰写本文时)使我感到困惑。基本上是:
1)需要设置Cloudfront Distribution以限制对存储桶的访问。 (如果没有这样做,它似乎没有将auth标头传递给S3)
2)散列有效载荷
3)签署Cloudfront URL
4)签署请求
要使用Crypto.js(Core&amp; SHA256)
来散列有效负载var reader = new FileReader();
reader.onload = function(readerEvt) {
var binaryString = readerEvt.target.result;
var wordArray = arrayBufferToWordArray(binaryString);
var hash = CryptoJS.SHA256(wordArray);
var hashedPayload = hash.toString(CryptoJS.enc.Hex);
// send the hashed payload serverside for use in calculating the signed request
};
reader.readAsArrayBuffer(file);
并签署我所遵循的请求:
http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html
(如果您需要更多信息,请发表评论)