【问题标题】:Sign S3 upload policy using Instance Profile credentials使用实例配置文件凭证签署 S3 上传策略
【发布时间】:2013-09-16 23:05:21
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: php amazon-s3 amazon-ec2


    【解决方案1】:

    事实证明,这只是需要在 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-30
      • 1970-01-01
      • 2016-09-25
      • 1970-01-01
      相关资源
      最近更新 更多