首页 > 解决方案 > 使用纯 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'.

标签: javascriptrestapiamazon-s3get

解决方案


您可能希望使用 SDK,结合浏览器调试器来确定 SDK 如何格式化请求。在 Chrome 调试器网络选项卡中,您可以将请求复制为 javascript 提取。这将显示您需要设置的所有标题。然后,您可以将其用作非 SDK 代码的基础。


推荐阅读