2016-06-29 43 views
0

我有一個應用程序將文檔上傳到S3存儲桶。沒有問題存在,但是當我在請求中指定一些自定義頁眉像這樣:S3:自定義標題返回403

req.setHeader('x-amz-meta-purpose', 'purpose'); 

而寫匹配CORS規則鬥:

<CORSRule> 
    <AllowedOrigin>http://www.example.com</AllowedOrigin> 
    <AllowedMethod>PUT</AllowedMethod> 
    <AllowedMethod>POST</AllowedMethod> 
    <AllowedMethod>DELETE</AllowedMethod> 
    <AllowedHeader>*</AllowedHeader> 
    <MaxAgeSeconds>3000</MaxAgeSec> 
    <ExposeHeader>x-amz-meta-purpose</ExposeHeader> 
</CORSRule> 

我得到一個403響應。我忘了什麼?我的代碼工作正常,沒有添加自定義頭。

更新

我得到這樣的迴應:

<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message> 

如何改變我的簽名,包括自定義頁眉?它目前是這樣的:

String stringToSign = 'PUT\n\n' + contentType + '\n' + now + '\n' + '/' + bucketname + '/' + lead.Id + '/' + fileName; 
String encodedStringToSign = EncodingUtil.urlEncode(stringToSign, 'UTF-8'); 
Blob mac = Crypto.generateMac('HMACSHA1', Blob.valueOf(stringToSign), Blob.valueOf(secret)); 
String signed = EncodingUtil.base64Encode(mac); 

有關如何添加標題的任何想法或文檔?

+0

什麼是ÿ ou試圖實現使用該自定義標題? – error2007s

+0

您是否檢查了403的響應主體以獲取解釋?許多S3錯誤在主體XML中有有用的信息。最可能的解釋是在計算簽名時沒有正確或完全考慮附加標題。 –

+0

你說得對,@ Michael-sqlbot。我會更新這個問題。 –

回答

1

您使用簽名V2,所以你需要包括「規範化AMZ頭」 ......

String stringToSign = 'PUT\n\n' + 
         contentType + '\n' + 
         now + '\n' + 
>>>>>> here >>>>>> CanonicalizedAmzHeaders + 
         '/' + bucketname + '/' + lead.Id + '/' + fileName; 

注意沒有額外的「\ n」後需要新的價值,但它的CanonicalizedAmzHeaders字符串本身以'\ n'結尾。

規範化AMZ頭是通過每頭迭代與x-amz-開始,與頭名轉換爲小寫,然後分類詞彙,建立一個字符串,它看起來像這樣(僞)建:

lowercase(header1) + ':' + trim(value1) + '\n' + 
lowercase(header2) + ':' + trim(value2) + '\n' + 
... 

所以,在您的要求,將最後三個行是這樣的:

[date]\n 
x-amz-meta-purpose:purpose\n 
/bucketname/key 

http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html#ConstructingTheCanonicalizedResourceElement

+0

非常感謝。 –