У меня есть приложение, которое загружает документы в корзину S3. Здесь нет проблем, но когда я указываю в запросе несколько настраиваемых заголовков, например:

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
t56k 30 Июн 2016 в 00:57
Чего вы пытаетесь достичь с помощью этого настраиваемого заголовка?
 – 
error2007s
30 Июн 2016 в 01:15
Вы исследовали тело ответа 403 в поисках объяснения? Многие ошибки S3 содержат полезную информацию в теле XML. Наиболее вероятное объяснение состоит в том, что дополнительные заголовки не учитываются должным образом или полностью при вычислении подписи.
 – 
Michael - sqlbot
30 Июн 2016 в 01:17
Ты прав, @ Michael-sqlbot. Обновлю вопрос.
 – 
t56k
30 Июн 2016 в 02:28

1 ответ

Лучший ответ

Вы используете Signature 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

1
Michael - sqlbot 30 Июн 2016 в 03:00
Большое спасибо.
 – 
t56k
30 Июн 2016 в 03:15