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 に答える