Подписать политику загрузки S3 с использованием учетных данных профиля экземпляра

Я собираю интерфейс drag & drop для загрузки файлов, чтобы перейти непосредственно к S3. Мой рабочий процесс выглядит примерно так:

  1. После этого я делаю запрос AJAX на сервер,
  2. Сервер генерирует и подписывает политику загрузки S3,
  3. Клиентская сторона завершает загрузку.

Подписание политики осуществляется с помощью секретного ключа, как описано в этой статье . Однако я столкнулся со следующими проблемами:

  1. Я, очевидно, могу сделать Aws::getConfig() и вытащить секретный ключ оттуда, но это, кажется, не очень чистый подход.

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

В обоих случаях я мог обойти SDK и сделать это вручную, так что на самом деле вопрос: можно ли это сделать с SDK, и если да, то как?

Solutions Collecting From Web of "Подписать политику загрузки S3 с использованием учетных данных профиля экземпляра"

Оказывается, для этого просто нужно было копаться в API. Учетные данные можно вытащить из любого из клиентов, которые вы создаете через Aws\Common\Aws::get() .

 // create builder; not passing credentials here $aws = Aws\Common\Aws::factory(array( 'region' => 'us-east-1', )); $s3 = $aws->get('s3'); // get credentials interface $credentials = $s3->getCredentials(); 

Чтобы подписать строку политики, вам нужен экземпляр S3Signature . Согласно документации для AbstractClient::getSignature() , похоже, вы не можете получить это от S3Client , но, судя по этой части кода, кажется, что вы можете.

Последний шаг – вызвать метод ::signString() для генерации подписи:

 $policy = base64_encode(json_encode($policy_data)); $signer = $s3->getSignature(); $signature = $signer->signString($policy, $credentials); 

$credentials->getSecretKey() внутренне $credentials->getSecretKey() , который при необходимости загружает необходимые учетные данные из службы метаданных; в противном случае он использует учетные данные, которые передаются Aws::factory() .

Обновить

Это также возможно сделать без каких-либо клиентов:

 $credentials = Aws\Common\Credentials\Credentials::factory(); $signer = new S3Signature(); $signature = $signer->signString($policy, $credentials);