Сгенерированный AWS PresignedPost не содержит правильные URL / поля - PullRequest
1 голос
/ 30 октября 2019

Я пытаюсь загрузить файл в корзину AWS S3 с помощью заранее записанного сообщения.

Когда я генерирую PresignedPost на сервере, используя AWS SDK для Ruby (версия 3), я неполучить правильный URL-адрес и поля для клиента, чтобы сделать успешный запрос POST.

Генерация PresignedPost в ruby:

client = Aws::S3::Client.new(
  region: public_bucket_region,
  credentials: public_bucket_credentials
)

aws_bucket = Aws::S3::Bucket.new(
  public_bucket_name,
  client: client
)

request = aws_bucket.presigned_post(
  key: 'some-random-key',
  acl: 'public-read',
  expires: Time.zone.now + 5.minutes
)

puts request.url
=> "https://bucket-name.s3.eu-west-1.amazonaws.com"

puts request.fields
=>
{
  Expires: "Wed, 30 Oct 2019 16:53:01 GMT",
  acl: "public-read",
  key: 'some-random-key'
}

Согласно документации, все, что мне нужнона этом этапе сделать запрос POST к возвращенному URL, включая данные поля в теле.

Однако этого явно недостаточно, я получаю сообщение об отказе в доступе. Я ожидал, что URL будет содержать идентификатор ключа доступа, подпись, политику и т. Д.

Что мне не хватает?

Редактировать:

POST запрос строится как таковой (в приложении React Native), я понимаю, что мне нужны некоторые дополнительные вещи в теле / ​​заголовках, но мое предопределенное сообщение, похоже, не возвращает ничего полезного в request.fields:

const body = new FormData();
Object.entries(request.fields).forEach(([k, v]) => {
  body.append(k, v);
});
body.append('file', file);

await fetch(request.url, {
  method: 'post',
  body: body
});

1 Ответ

0 голосов
/ 31 октября 2019

Итак, я наконец-то получил эту работу, создав предварительно подписанное сообщение следующим образом:

Aws::S3::PresignedPost.new(
  public_bucket_credentials,
  public_bucket_region,
  public_bucket_name,
  {
    key: 'some-random-key',
    acl: 'public-read',
    expires: Time.zone.now + 5.minutes
  }
)

Затем все, что мне нужно (ключ доступа, подпись и политика), возвращается в ключе fields возвращенного предварительно назначенного сообщения. Почта. Никаких изменений в коде React не требуется.

Похоже, способ, которым я настраивал клиент, а затем создавал корзину, не проходил через учетные данные, необходимые для создания работоспособного предварительно записанного сообщения (я не совсем уверен, почемуAWS должен позволить этому случиться ...).

В любом случае, это работает сейчас! Спасибо всем за помощь.

...