Я пытаюсь использовать предварительно подписанный URL для загрузки, как описано в документации (https://docs.aws.amazon.com/AmazonS3/latest/dev/PresignedUrlUploadObject.html) Я могу получить предварительно подписанный URL, но когда я пытаюсь сделать PUT в Почтальоне, я получаю следующееошибка:
<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
Очевидно, что структурированный мой вызов пут не совпадает с тем, как AWS вычисляет подпись. Я не могу найти много информации о том, что требует этот вызов пут.
Я попытался изменить заголовок для Content-Type на multipart / form-data и application / octet-stream. Я также попытался снять отметку с раздела заголовков в почтальоне и полагаться на тип тела для обоихнастройки данных формы и двоичных файлов, в которых я выбираю файл. Настройка данных формы приводит к следующему добавлению в вызов:
Content-Disposition: form-data; name = "thefiletosend.txt"; filename ="thefiletosend.txt
Кроме того, я заметил, что почтальон включает в себя то, что он называет" временными заголовками ", следующим образом:
Хост: s3.amazonaws.com Тип контента: text / plain Пользователь-Agent: PostmanRuntime / 7.13.0 Принять: / Управление кэшем: без кэширования Почтальон-токен: e11d1ef0-8156-4ca7-9317-9f4d22daf6c5,2135bc0e-1285-4438-bb8e-b21d31dc36db Хост: s3.amazonaws.com accept-encoding: gzip, deflate content-length: 14 Соединение: keep-alive кэш-контроль: no-cache
Заголовок Content-Type может быть одной из проблем, но я неОпределенно, как исключить эти «временные заголовки» в почтальоне.
Я создаю предварительно подписанный URL-адрес в лямбде следующим образом:
public string FunctionHandler(Input input, ILambdaContext context)
{
_logger = context.Logger;
_key = input.key;
_bucketname = input.bucketname;
string signedURL = _s3Client.GetPreSignedURL(new GetPreSignedUrlRequest()
{
Verb = HttpVerb.PUT ,
Protocol = Protocol.HTTPS,
BucketName = _bucketname,
Key = _key,
Expires = DateTime.Now.AddMinutes(5)
});
returnObj returnVal = new returnObj() { url = signedURL };
return JsonConvert.SerializeObject(returnVal);
}