2015-07-20 20 views
10

我正在嘗試將一個PUT請求發送到amazonS3預先設置的URL。即使我只有一個PUT請求,我的請求似乎也會被調用兩次。第一個請求返回200 OK,第二個返回400 Bad Request只允許一個授權機制;只有X-Amz-Algorithm查詢參數..?

這裏是我的代碼:

var req = { 
    method: 'PUT', 
    url: presignedUrl, 
    headers: { 
     'Content-Type': 'text/csv' 
    }, 
    data: <some file in base64 format> 
}; 

$http(req).success(function(result) { 
    console.log('SUCCESS!'); 
}).error(function(error) { 
    console.log('FAILED!', error); 
}); 

更詳細地400 Bad Request錯誤:

<?xml version="1.0" encoding="UTF-8"?> 
<Error> 
    <Code>InvalidArgument</Code> 
    <Message>Only one auth mechanism allowed; only the X-Amz-Algorithm query parameter, Signature query string parameter or the Authorization header should be specified</Message> 
    <ArgumentName>Authorization</ArgumentName> 
    <ArgumentValue>Bearer someToken</ArgumentValue> 
    <RequestId>someRequestId</RequestId> 
    <HostId>someHostId</HostId> 
</Error> 

我不明白的是,爲什麼會返回400?和什麼是解決方法?

+0

我會調查爲什麼它被稱爲兩次,因爲第一次看起來工作OK –

+0

您是否找到任何解決方案? – Hemang

+2

如果您想調用s3 url,只需在調用之前刪除您在應用中用於其他任何API的授權標頭。 –

回答

12

你的客戶端可能是發送一個使用授權報頭,這是正在與302的響應包括具有簽名參數Location頭回應的初始請求。問題是來自初始請求的頭信息正在被複制到後續的重定向請求中,以便它包含Authorization和Signature。如果您從後續請求中刪除授權,您應該很好。

這發生在我身上,但在Java/HttpClient環境中。我可以在Java中提供解決方案的細節,但不幸的是不適用於AngularJS。

+0

如果你可以在Java中粘貼你的解決方案的細節,那將是很棒的......只是遇到了同樣的問題。 – velval

+0

不幸的是,代碼被替換爲訪問S3的另一種方式(通過應用程序服務器而不是直接流式傳輸)取代,因此我不再擁有它了。但基本上你可以訪問響應頭並在將它們應用到後續請求之前刪除授權。 – mlohbihler

+2

這一個非常有幫助。我在郵差中遇到同樣的問題。有什麼辦法可以解決它 – arjuncc

0

我知道這可能是來不及回答,但像@mlohbihler說,這個錯誤對我的原因是由HTTP攔截我的角度有設置發送的授權頭。 本質上,我沒有正確過濾掉AWS S3域,以避免它自動獲取JWT授權標頭。

0

另外,400的「無效參數」可能會因爲您的S3 :: Presigner的錯誤配置/憑據而出現,該配置/憑證將預先設置網址開頭。一旦你通過400,你可能會遇到像我一樣的501「未執行」的迴應。能夠通過指定Content-Length標頭(指定here作爲所需標頭)來解決此問題。希望這有助於@arjuncc,它在用預先登記的URL測試s3圖像上傳時解決了我的郵遞員問題。