У меня есть приложение, которое загружает документы в корзину 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);
Есть идеи или документация о том, как добавить к этому заголовки?
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
Похожие вопросы
Новые вопросы
amazon-web-services
Amazon Web Services (AWS) — это общедоступное облако: IaaS (инфраструктура как услуга), PaaS (платформа как услуга) и SaaS (программное обеспечение как услуга), предоставляемые Amazon. Вопросы по программированию и архитектуре в тему. Общую справку по серверу можно получить по адресу https://serverfault.com. Тег AWS редко используется сам по себе и обычно используется с другими тегами, чтобы более четко определить тему вопроса.