Я пытаюсь выполнить загрузку документа, используя предварительно подписанный URL-адрес PUT S3. Я создал URL-адрес с помощью Java AWS SDK (GeneratePresignedUrlRequest.java). Этот код генерации URL находится в лямбда-функции за шлюзом API AWS.
Однако я получаю следующую ошибку, когда копирую сгенерированный URL-адрес в Postman и пытаюсь выполнить загрузку.
<Error>
<Code>AccessDenied</Code>
<Message>
There were headers present in the request which were not signed
</Message>
<HeadersNotSigned>host</HeadersNotSigned>
<RequestId>6E624EC66091A099</RequestId>
<HostId>
9HnUUZpa9zUWfyzuNrZtRkoN2CYxH8V6rqx5QgsMFC6foTZKuG5qmZL5ThnUXooYPk2reFzKKUg=
</HostId>
</Error>
Сгенерированный URL-адрес: https: // <ведро> .s3.amazonaws.com / <ключ>? X-Amz-Security-Token = <значение> & X-Amz-Algorithm = AWS4-HMAC-SHA256 & X-Amz-Date = 20180718T013339Z & X-Amz-SignedHeaders = content-type% 253Bhost & X-Amz-Expires = 1799 & X-Amz-Credential = <значение> & X-Amz-Signature = <значение>
Любые предложения относительно того, что нужно исправить здесь при генерации URL-адреса?





Ошибка действительно была связана с «отсутствующим заголовком», но не с «хозяин», которое вводило в заблуждение. Значение «Тип содержимого», которое стоит перед «host» в Заголовки, подписанные X-Amz = content-type% 253Bhost, должно быть явно указано в качестве заголовка запроса, когда http-клиент использует предварительно подписанный URL-адрес для загрузки файла на S3.
Я создал предварительно подписанный URL-адрес в Java как
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName,objectKey).withMethod(HttpMethod.PUT).withContentType("application/pdf").withExpiration(expiration);
Итак, S3 ожидает, что Тип содержимого со значением 'application / pdf' будет частью предварительно подписанного запроса URL-адреса в качестве заголовка для соответствия подписи, как я понимаю.