Я собираю интерфейс drag & drop для загрузки файлов, чтобы перейти непосредственно к S3. Мой рабочий процесс выглядит примерно так:
Подписание политики осуществляется с помощью секретного ключа, как описано в этой статье . Однако я столкнулся со следующими проблемами:
Я, очевидно, могу сделать Aws::getConfig()
и вытащить секретный ключ оттуда, но это, кажется, не очень чистый подход.
При развертывании в EC2 у меня вообще не будет доступа к секретному ключу, потому что я использую роли экземпляра, поэтому мне не нужно хранить мои учетные данные на самом сервере.
В обоих случаях я мог обойти SDK и сделать это вручную, так что на самом деле вопрос: можно ли это сделать с SDK, и если да, то как?
Оказывается, для этого просто нужно было копаться в 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);