4

我正在为文件上传建立一个拖放界面,以直接进入 S3。我的工作流程是这样的:

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

如本文所述,使用密钥对策略进行签名。但是,我面临以下问题:

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

  2. 当部署在 EC2 上时,我根本无法访问密钥,因为我使用的是实例角色,因此我不必将我的凭据存储在服务器本身上。

在这两种情况下,我都可以绕过 SDK 并手动完成,所以问题真的是:这可以用 SDK 完成吗?如果可以,怎么做?

4

1 回答 1

5

事实证明,这只需要在 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()调用,必要时从元数据服务加载必要的凭证;否则它使用传递给Aws::factory().

更新

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

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

$signature = $signer->signString($policy, $credentials);
于 2013-09-12T15:00:08.293 回答