Ja͢*_*͢ck 4 php amazon-s3 amazon-ec2
我正在整理一个用于文件上传的拖放界面,直接转到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();
Run Code Online (Sandbox Code Playgroud)
要签署策略字符串,您需要一个实例S3Signature.根据AbstractClient::getSignature()它的文档似乎你无法从中获取S3Client,但从这部分代码判断你似乎可以.
最后一步是调用::signString()方法来生成签名:
$policy = base64_encode(json_encode($policy_data));
$signer = $s3->getSignature();
$signature = $signer->signString($policy, $credentials);
Run Code Online (Sandbox Code Playgroud)
在内部$credentials->getSecretKey()调用,在必要时从元数据服务加载必要的凭据; 否则它使用传递给的凭据Aws::factory().
更新
没有任何客户也可以这样做:
$credentials = Aws\Common\Credentials\Credentials::factory();
$signer = new S3Signature();
$signature = $signer->signString($policy, $credentials);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
612 次 |
| 最近记录: |