我正在整理一个用于文件上传的拖放界面,以便直接转到 S3。我的工作流程是这样的:
- 放下后,我向服务器发出 AJAX 请求,
- 服务器生成并签署 S3 上传策略,
- 客户端完成上传。
如所述in this article,使用 key 签署策略.但是,我面临以下问题:
我显然可以做到
Aws::getConfig()
并从那里找出 key ,但这似乎不是一个非常干净的方法。部署在 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/