如何使用来自简单HTML页面的rest API调用从AWS s3 buket获取文件

时间:2017-11-01 13:17:15

标签: javascript rest amazon-s3

我已经编写了一个小代码来从AWS s3获取所有文件,但我认为我缺少某些东西所以我得到了

  

错误:403禁止。

在下面的代码中,我是我帐户的生成签名,也是创建时间。

如果有人有任何其他代码示例请分享。我阅读了AWS-s3文档,但我没有得到一些要点

<!DOCTYPE html>
<html>
<head>
    <title>fbjhbvaiu</title>
    <script src="./dist/forge.min.js"></script> 

</head>
<body>
<script type="text/javascript">
var aws_access_key = 'aws_access_key';
var aws_secret_key = 'aws_secret_key';
var bucket = 'bucket_namr';
var region = 'us-east-1';
var keyPrefix = '';
var contentType = 'application/x-www-form-urlencoded';
var successRedirect = 'www.google.com';
var kmsKeyArn = 'arn:aws:s3:::parse-html-code';

/*MY script........*/
var currentdate = new Date(); 
var currentDate1 = currentdate.getFullYear()+""                                                         
                  + (currentdate.getMonth()+1)+"" 
                    +currentdate.getDate()+""+"T"               
                  + (currentdate.getHours()+1)+""  
                  + currentdate.getMinutes()+""
                  + currentdate.getSeconds()+"Z";

var parsedDateTime1 = currentdate.getFullYear()+""  
                     +(currentdate.getMonth()+1)+"" 
                       +currentdate.getDate();

var expiration1 = currentdate.getFullYear()+"-"                                                 
                + (currentdate.getMonth()+1)+"-" 
                +currentdate.getDate()+""+"T"               
                + (currentdate.getHours()+1)+":"  
                + currentdate.getMinutes()+":"
                + currentdate.getSeconds()+"Z";

var GMT = currentdate.getFullYear()+""                                  
                        + (currentdate.getMonth()+1)+"" 
            +currentdate.getDate()+""+"T"               
            +(currentdate.getHours()-5)+""
            +(currentdate.getMinutes()-30)+""
            +currentdate.getSeconds()+"Z";

function convertJsonToString(policy) {
  var encodedPolicy = forge.util.encode64(JSON.stringify(policy)); 
  return encodedPolicy;
};

function sign(key, msg) {
  var hmac = forge.hmac.create();
  hmac.start("sha256", key);
  hmac.update(msg);
  var digest = hmac.digest();
  return digest;
};



// Create string for X-Amz-Credential value
var credential = aws_access_key+ "/" + parsedDateTime1 + "/" + region + "/s3/aws4_request";

/* POLICY */
var json = { "expiration": expiration1,
"conditions": [
{"bucket": bucket},
["starts-with", "$key", keyPrefix],
{"acl": "public-read"},
{"success_action_redirect": successRedirect},
["starts-with", "$Content-Type", contentType],
{"x-amz-credential": credential},
{"x-amz-algorithm": "AWS4-HMAC-SHA256"},
{"x-amz-date": currentDate1},
{"x-amz-server-side-encryption": "aws:kms"},
{"x-amz-server-side-encryption-aws-kms-key-id": kmsKeyArn}
]
};

// Convert POLICY from JSON to String and Base64 encode it.
var stringToSign = convertJsonToString(json);
console.log('String To Sign: ' + stringToSign); // DEBUG

/* GENERATE THE SIGNATURE */
// Hash 1 - Key: AWS4ACCESSKEYID, Message: date
console.log('Generate dateKey...'); // DEBUG
var dateKey = sign("AWS4" + aws_secret_key, parsedDateTime1);

// Hash 2 - Key: dateKey, Message: region
console.log('Generate dateRegionKey...'); // DEBUG
var dateRegionKey = sign(dateKey, region);

// Hash 3 - Key: dateRegionKey, Message: "s3"
console.log('Generate dateRegionServiceKey...'); // DEBUG
var dateRegionServiceKey = sign(dateRegionKey, "s3");

// Hash 4 - Key: dateRegionServiceKey, Message: "aws4_request"
console.log('Generate signingKey...'); // DEBUG
var signingKey = sign(dateRegionServiceKey, "aws4_request");

// Hash 5 - Key: signingKey, Message: stringToSign

console.log('Generating signature...'); // DEBUG
var hmac = forge.hmac.create();
hmac.start("sha256", signingKey);
hmac.update(stringToSign);
var signature = hmac.digest().toHex();
console.log('Signature: ' + signature); // DEBUG

</script>
<script type="text/javascript">
    var data = null;

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === 4) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://s3.amazonaws.com/parse-html-code");
xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded");
xhr.setRequestHeader("host", "parse-html-code.s3.amazonaws.com");
xhr.setRequestHeader("x-amz-content-sha256", "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
xhr.setRequestHeader("x-amz-date", GMT);
xhr.setRequestHeader("authorization", "AWS4-HMAC-SHA256 Credential=AKIAJIIA5X7UFLLZ3RUA/"+parsedDateTime1+"/us-east-1/s3/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature="+signature);

xhr.send(data);
console.log(xhr.responseText)

</script>

<h1>.................inspect it................</h1>



<p id="parsedDateTime1">
<script>
document.getElementById("parsedDateTime1").innerHTML = parsedDateTime1+"'''''''''''''parsedDateTime1'''''''''''''''''''";

</script>
</p>

<p id="expiration1">
<script>
    document.getElementById("expiration1").innerHTML = expiration1+"'''''''''''''expiration1'''''''''''''''''''";

</script>
</p>
<p id= "currentDate1">
    <script type="text/javascript">
          document.getElementById("currentDate1").innerHTML = currentDate1+"............My date nd time";
    </script>
</p>
<p id= "GMT">
    <script type="text/javascript">
          document.getElementById("GMT").innerHTML = GMT+"............GMT";
    </script>
</p>


<p id= "hmac">
    <script type="text/javascript">
        function sign(key, msg) {
  var hmac = forge.hmac.create();

  hmac.start("sha256", key);
  hmac.update(msg);
  var digest = hmac.digest();
  document.getElementById("hmac").innerHTML = "";


    return digest ;


};  

    </script>
</p>
</body>
</html>

0 个答案:

没有答案