javascript - 使用纯 Javascript(无 SDK)对 AWS S3 进行 REST 调用
问题描述
我正在尝试使用纯 Javascript 向 AWS S3 发出 GET 请求。这是因为不幸的是,我无法再将 SDK 用于我的所有请求。我一直在尝试遵循亚马逊提供的文档,但是进展甚微。到目前为止,我只能生成我的签名密钥。如果有人可以发布一个纯 Javascript 的示例,该示例可以通过简单的调用来检索对象,甚至列出具有特定前缀的所有对象,我会很高兴。老实说,我完全迷失了阅读他们的文档。似乎它只对非常熟悉拨打这些电话的人有用。这张图片上的#1 和 #2在这里是我正在努力解决的问题。我想我有点理解他们想要什么,但我不知道如何将其完全转化为实际请求。不幸的是,他们文档上的代码示例很少而且相差甚远 - 其中很多只是伪代码/整个事情的一小部分
编辑:你好有人读过这个吗
edit2:这里有一些不起作用的东西,我正试图弄清楚该怎么做
var signingKey = getSigningKey(dateStamp, secretKey, regionName, serviceName);
var time = new Date();
//fullURL is something like https://s3.amazon.aws.com/{bucketName}/{imageName}
time = time.toISOString();
time = time.replace(/:/g, '').replace(/-/g,'');
time = time.substring(0,time.indexOf('.'))+"Z";
var request = new XMLHttpRequest();
var canonString = "GET\n"+
encodeURI(fullURL)+"\n"+
encodeURI("Key=asd.jpeg")+"\n"+
"host:s3.amazonaws.com\n"+
"x-amz-content-sha256:"+CryptoJS.SHA256("").toString()+"\n"+
"host;x-amz-content-sha256\n"+
CryptoJS.SHA256("").toString();
var stringToSign = "AWS4-HMAC-SHA256\n"+
time+"\n"+
"20181002/us-east-1/s3/aws4_request\n"+
CryptoJS.SHA256(canonString).toString();
var authString = CryptoJS.HmacSHA256(signingKey, stringToSign).toString();
var queryString = "GET https://s3.amazonaws.com/?Action=GetObject&Version=2010-05-08 HTTP/1.1\n"+
"Authorization: AWS4-HMAC-SHA256 Credential="+accessKey+"/20181002/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-date, Signature="+authString+"\n"+
"host: s3.amazonaws.com\n"+
"x-amz-date: "+time+"\n";
request.open("GET", "https://s3.amazonaws.com/?Action=GetObject&Version=2010-05-08", false);
request.setRequestHeader("Authorization", "AWS4-HMAC-SHA256 Credential="+accessKey+"/20181002/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-date, Signature="+authString);
request.setRequestHeader("host", "s3.amazonaws.com");
request.setRequestHeader("x-amz-date", time);
request.send();
编辑3:这是我得到的一堆错误,大概是因为我不知道我在做什么。
index.js:61 Refused to set unsafe header "host"
index.js:63 OPTIONS https://s3.amazonaws.com/?Action=GetObject&Version=2010-05-08 403 (Forbidden)
index.js:63 Failed to load https://s3.amazonaws.com/?Action=GetObject&Version=2010-05-08: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.
index.js:63 Uncaught DOMException: Failed to execute 'send' on 'XMLHttpRequest': Failed to load 'https://s3.amazonaws.com/?Action=GetObject&Version=2010-05-08'.
解决方案
您可能希望使用 SDK,结合浏览器调试器来确定 SDK 如何格式化请求。在 Chrome 调试器网络选项卡中,您可以将请求复制为 javascript 提取。这将显示您需要设置的所有标题。然后,您可以将其用作非 SDK 代码的基础。