1

POST メソッドを使用して、HTML フォーム経由で Google Cloud Storage にファイルをアップロードしようとしています。Google はドキュメントで、非標準 ACL を割り当てるにはポリシーと署名フィールドの両方が必要であると述べています。

これらの値を生成する方法に関する説明を読むと、非常に簡単に思えます。残念ながら、何度も試行しても、Google のフィルターを通過する値を生成することはできません。私の署名がポリシー ドキュメントと一致しないというエラーが継続的に表示されます。

誰かが私が間違っている場所を教えてもらえますか? これは私のプロセスです:

  1. ポリシー文書を作成する

これは簡単な部分です。私のポリシー文書は次のとおりです。

{"expiration": "2015-06-16T11:11:11Z", 
"conditions": [ 
    ["starts-with", "$key", ""], 
    {"acl": "public-read" }, 
    {"bucket": "publicjs"}, 
    {"success_action_redirect": "http://localhost/gcs.php" } 
] }
  1. 次に、この Web サイトにアクセスし、上記の値を base64 でエンコードしました。 これは、私がポリシー ドキュメントとして使用しているものです。

  2. ではサインを。秘密鍵を暗号化キーとして使用してポリシー ドキュメントを暗号化する必要があるため、この Web サイトにアクセスして暗号化を行いました。base64 でエンコードされたポリシー ドキュメント (ステップ 2 から) をメイン テキスト領域に入力し、相互運用性の「秘密」キーをキー ボックスに入力しました。

  3. Enter キーを押すと、base64 の横の値が署名値になります。

  4. 値をフォームに入れ、POST リクエストを送信し、エラーを受け取ります。

どこが間違っていますか?

4

1 に答える 1

4

エンコード シーケンスは次のようになります。

  • base64 でポリシー ドキュメントをエンコードします (これをエンコードされたポリシーと呼びましょう)

  • エンコードされたポリシーの SHA1 ハッシュ (相互運用キーのみ、RSA キーを使用する場合は SHA256 を使用) を生成し、それを base64 エンコードします (これを署名と呼びましょう)

  • エンコードされたポリシーと署名をフォーム ポスト リクエストで送信します (フォームの残りの部分と共に)

Python でのシーケンスの理想的な実装を次に示します。

  POLICY = '''{
                "expiration": "2015-06-16T11:11:11Z", 
                "conditions": [
                  ["starts-with", "$key", "test"],
                  {"acl" : "public-read"}
                ]
              }'''

  GEN_FORM = '''
    <form action="%s" method="post" enctype="multipart/form-data">
      <input type="hidden" name="acl" value="public-read">
      <input type="hidden" name="bucket" value="YOUR_BUCKET">
      <input type="hidden" name="key" value="YOUR_OBJECT_NAME">
      <input type="hidden" name="GoogleAccessId" value="YOUR_ACCESS_ID">
      <input type="hidden" name="policy" value="%s">
      <input type="hidden" name="signature" value="%s">
      <input name="file" type="file">
      <input type="submit" value="Upload">
    </form>
  '''

  encoded_policy = base64.b64encode(POLICY).strip()
  h = hmac.new(YOUR_SECRET_KEY, digestmod=sha.sha)
  h.update(encoded_policy)
  signature = base64.b64encode(h.digest())
  gen_html = GEN_FORM % (url, encoded_policy, signature)
于 2012-04-06T03:34:09.160 に答える