許可される認証メカニズムは 1 つだけです。X-Amz-Algorithm クエリ パラメータのみ。質問する

許可される認証メカニズムは 1 つだけです。X-Amz-Algorithm クエリ パラメータのみ。質問する

amazonS3 の署名済み URL に PUT リクエストを送信しようとしています。PUT リクエストが 1 つしかないのに、リクエストが 2 回呼び出されているようです。最初のリクエストは を返し200 OK、2 番目のリクエストは を返します400 Bad Request

これが私のコードです:

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 が返されるのか、回避策は何なのかということです。

ベストアンサー1

おそらくクライアントは Authorization ヘッダーを使用する最初のリクエストを送信しており、302 で応答しています。レスポンスには、Signature パラメータを持つ Location ヘッダーが含まれています。問題は、最初のリクエストのヘッダーが後続のリダイレクト リクエストにコピーされ、Authorization と Signature の両方が含まれることです。後続のリクエストから Authorization を削除すれば、問題は解決するはずです。

これは私にも起こりましたが、Java / HttpClient 環境で発生しました。Java での解決策の詳細は提供できますが、残念ながら AngularJS では提供できません。

おすすめ記事