php - 使用实例配置文件凭据签署 S3 上传策略

标签 php amazon-s3 amazon-ec2

我正在整理一个用于文件上传的拖放界面,以便直接转到 S3。我的工作流程是这样的:

  1. 放下后,我向服务器发出 AJAX 请求,
  2. 服务器生成并签署 S3 上传策略,
  3. 客户端完成上传。

如所述in this article,使用 key 签署策略.但是,我面临以下问题:

  1. 我显然可以做到 Aws::getConfig()并从那里找出 key ,但这似乎不是一个非常干净的方法。

  2. 部署在 EC2 上时,我根本无法访问 key ,因为我使用的是 instance roles这样我就不必将我的凭据存储在服务器本身上。

在这两种情况下,我都可以绕过 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 获取此信息,但从 this part 判断看起来你可以的代码。

最后一步是调用 ::signString()签名生成方法:

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

内部$credentials->getSecretKey()被调用,必要时从元数据服务加载必要的凭证;否则它使用传递给 Aws::factory() 的凭据。

更新

也可以在没有任何客户端的情况下执行此操作:

$credentials = Aws\Common\Credentials\Credentials::factory();
$signer = new S3Signature();

$signature = $signer->signString($policy, $credentials);

关于php - 使用实例配置文件凭据签署 S3 上传策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18766336/

相关文章:

amazon-web-services - 使用 AWS CLI 从 S3 复制到 EC2

Mysql 插入后 PHP 重定向

multithreading - Spark/EMR能否从s3多线程读取数据

php - swfupload:如何解析从 upload.php 脚本返回的数据?

ssl - letsencrypt/certbot - 多个身份验证器,一个证书

sql-server -/opt/mssql/bin/sqlservr : This program requires a machine with at least 2000 megabytes of memory

amazon-web-services - 我的工作线程层返回 400 错误,CloudWatch 错误?

ubuntu - 在 AWS EC2 Ubuntu 中设置 kafka.service 和 zookeeper.service

php - Laravel:View::share() 和 View::composer() 之间的区别

php - 如何修复PHP中的“ header 已发送”错误