s3 preigned url обязательные заголовки пользовательских запросов - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь сгенерировать предварительно назначенный 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 Ответ

0 голосов
/ 06 февраля 2019

Вы смотрели на 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>

Обновление:

Я использовал getSignedUrl API в 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"

Метаданные пользователя :

enter image description here

Клиенту не нужно добавлять какие-либо заголовки, чтобы иметь возможность добавлятьметаданные пользователя.Если клиент попытается изменить x-amz-meta- * или удалить его, он получит SignatureDoesNotMatch, что именно то, что вы хотите.

Modify 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>
...