s3 preigned url обязательные заголовки пользовательских запросов
Я пытаюсь создать предопределенный URL с некоторыми пользовательскими данными, так как я понимаю, что мне нужно использовать пользовательские заголовки запросов
GeneratePresignedUrlRequest generatePresignedUrlRequest =
new GeneratePresignedUrlRequest(bucket, objectKey)
.withMethod(httpMethod)
.withExpiration(expiration);
if (params != null) {
params.forEach(
(k, v) ->
generatePresignedUrlRequest.putCustomRequestHeader(
Headers.S3_USER_METADATA_PREFIX + k.toLowerCase(), v));
}
return s3.generatePresignedUrl(generatePresignedUrlRequest);
Даже если получатель сгенерированного URL должен установить заголовки. Есть ли способ заставить потребителя добавить эти заголовки? например: бросить неверный запрос (400), когда требуемый заголовок (пользовательский) отсутствует
1 ответ
Вы смотрели в addRequestParameter? Это добавит параметры строки запроса, и без этих параметров запрос не будет выполнен.
Например
generatePresignedUrlRequest.addRequestParameter(Headers.S3_USER_METADATA_PREFIX + "test", "true");
Сгенерированный URL будет содержать следующий параметр:
https://aws-domain/file.ext?x-amz-meta-test=true&X-Amz-Security-Token=<TOKEN>
Обновить:
Я использовал API getSignedUrl в Node.js для генерации подписанного URL с метаданными пользователя в параметрах строки запроса. Я не разработчик JAVA, поэтому я предложил вам использовать addRequestParameter
который генерирует подписанный URL с метаданными, предоставленными в методе.
Код Node.js
const url = s3.getSignedUrl('putObject', {
'Bucket': 'my-bucket',
'Key': 'signed.json',
'Metadata': {
'my-id': '1234'
}
});
Подписанный URL:
https://my-bucket.s3.eu-west-1.amazonaws.com/signed.json?AWSAccessKeyId=<AccessKey>&Expires=1549497606&Signature=<SignatureKey>&x-amz-meta-my-id=1234
Загрузить файл:
curl -k -X PUT -T "signed.json" "https://my-bucket.s3.eu-west-1.amazonaws.com/signed.json?AWSAccessKeyId=<AccessKey>&Expires=1549497606&Signature=<SignatureKey>&x-amz-meta-my-id=1234"
Метаданные пользователя:
Клиенту не нужно добавлять какие-либо заголовки, чтобы иметь возможность добавлять метаданные пользователя. Если клиент попытается изменить x-amz-meta- * или удалить его, он получит SignatureDoesNotMatch
что именно то, что вы хотите.
Изменить x-amz-meta-my-id
curl -k -X PUT -T "signed.json" "https://my-bucket.s3.eu-west-1.amazonaws.com/signed.json?AWSAccessKeyId=<AccessKey>&Expires=1549497606&Signature=<SignatureKey>&x-amz-meta-my-id=123"
Ожидаемая ошибка:
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><AWSAccessKeyId>AKIAJ5PO6T7F772ZPSPQ</AWSAccessKeyId>