2012-01-26 10 views
6

私は、ブラウザ内、フォームベースのS3へのポストのための署名のベース64エンコーディングで読むことがほとんどすべてを読んだと思う:古いドキュメントと新しいドキュメント。例えば:S3用のPython生成シグネチャ

http://doc.s3.amazonaws.com/proposals/post.html

とにもこれを見つけた:

、私はドラフトしようとしているむしろ上記またはAmazonの新しいポリシー生成、または後のBotoの周りいじるを使用するよりもhttp://s3.amazonaws.com/doc/s3-example-code/post/post_sample.html

より簡単な.pyスクリプトで、ポリシーJSONをプレーンテキストファイル(policy.txt)から取得し、HTMLフォームを作成するのに役立つbase-64エンコードされた署名を生成します。

(エンコードされたポリシーに依存している)署名自体は正しくエンコードされていません...おそらくutf-8とasciiの違いや\ n(改行)の問題がありますか?

下記のスクリプトは以下のとおりです。ポリシーとAWS秘密鍵private_keyは、このスクリプトが動作するかどうかを確認するために使用しているAWSテストケースからのものです。 Amazonで引用されているように正しくエンコードされた署名は、参照用に以下のスクリプトに含まれています。

以下の計算として署名がつまりアマゾン?:

によって提供される基準署名と一致しない理由を誰も私に伝えることができます:

をこれが正しくエンコードされている理由:

policy_encoded = base64.b64encode(policy) 

これはNOTです:

signature = base64.b64encode(hmac.new(private_key, policy_encoded, sha).digest()) 

パイソン署名c alculator ...

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import base64, hmac, sha 
from sys import argv 

script, policy = argv 

private_key = 'uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o' 
input = open("..Desktop/policy.txt", "rb") 
policy = input.read() 
policy_encoded = base64.b64encode(policy) 
signature = base64.b64encode(hmac.new(private_key, policy_encoded, sha).digest()) 
print "Your policy base-64 encoded is %s." % (policy_encoded) 
print "Your signature base-64 encoded is %s." % (signature) 
print "Your signature encoded should be 2qCp0odXe7A9IYyUVqn0w2adtCA=" 

JSONポリシー(policy.txt - UTF-8)

{ "expiration": "2007-12-01T12:00:00.000Z", 
"conditions": [ 
{"bucket": "johnsmith"}, 
["starts-with", "$key", "user/eric/"], 
{"acl": "public-read"}, 
{"success_action_redirect": "http://johnsmith.s3.amazonaws.com/successful_upload.html"}, 
["starts-with", "$Content-Type", "image/"], 
{"x-amz-meta-uuid": "14365123651274"}, 
["starts-with", "$x-amz-meta-tag", ""] 
] 
} 
+0

Rik:ughごめんなさい!見たこともありませんでした! JSONブロックをインデントで受け入れるためにSOエディタを取得するのは苦労していましたが、これを解決するために何を重視すべきか教えてください... – Sean

+1

'Ctrl + K'を使用してくださいコードブロックをインデントするために、自動的に4つのスペースを追加し、編集したものを見てください([x min ago](http://stackoverflow.com/posts/9018767/revisions)をクリックして前のリビジョンを参照してください)。メインコードはまだフォーマットが悪いですし、あまりにも多くの単語があります。私はあなたの質問がちょっと "恐ろしい"ように見えますが、集中した質問はもっと解決しそうです*(良い質問を書くのは簡単ではない)* –

+0

申し訳ありませんDulyは指摘していますが、編集内容に戻ってくると思いますが、私はそれを締めてあまり詳しく説明しません。 – Sean

答えて

5

私は、これはあなたのpolicy.txtファイルの内容にダウンしていると思います。私は、参照リンク(http://doc.s3.amazonaws.com/proposals/post.html)から政策を取り、正確に同じシグネチャを得るためにpolicy.txt

{ "expiration": "2007-12-01T12:00:00.000Z", 
    "conditions": [ 
    {"bucket": "johnsmith" }, 
    ["starts-with", "$key", "user/eric/"], 
    {"acl": "public-read" }, 
    {"redirect": "http://johnsmith.s3.amazonaws.com/successful_upload.html" }, 
    ["starts-with", "$Content-Type", "image/"], 
    {"x-amz-meta-uuid": "14365123651274"}, 
    ["starts-with", "$x-amz-meta-tag", ""], 
    ] 
} 

としてそれを保存し

、このファイルは、まったく同じ内容を持っている必要があります。参考

、Iは、コピー&ペースト: MD5(policy.txt)= 5bce89d9ff799e2064c136d76bc7fc7a

Iは、(あなたと同様、ファイル名だけを調整し、argsを除去する)、次のスクリプトを使用する場合

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import base64, hmac, sha 

private_key = 'uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o' 
input = open("policy.txt", "rb") 
policy = input.read() 
policy_encoded = base64.b64encode(policy) 
signature = base64.b64encode(hmac.new(private_key, policy_encoded, sha).digest()) 
print "Your policy base-64 encoded is %s." % (policy_encoded) 
print "Your signature base-64 encoded is %s." % (signature) 
print "Your signature encoded should be 2qCp0odXe7A9IYyUVqn0w2adtCA=" 

出力は私が取得:

 
Your policy base-64 encoded is 
eyAiZXhwaXJhdGlvbiI6ICIyMDA3LTEyLTAxVDEyOjAwOjAwLjAwMFoiLAogICJjb25kaXRpb25zIjo 
gWwogICAgeyJidWNrZXQiOiAiam9obnNtaXRoIiB9LAogICAgWyJzdGFydHMtd2l0aCIsICIka2V5Ii 
wgInVzZXIvZXJpYy8iXSwKICAgIHsiYWNsIjogInB1YmxpYy1yZWFkIiB9LAogICAgeyJyZWRpcmVjd 
CI6ICJodHRwOi8vam9obnNtaXRoLnMzLmFtYXpvbmF3cy5jb20vc3VjY2Vzc2Z1bF91cGxvYWQuaHRt 
bCIgfSwKICAgIFsic3RhcnRzLXdpdGgiLCAiJENvbnRlbnQtVHlwZSIsICJpbWFnZS8iXSwKICAgIHs 
ieC1hbXotbWV0YS11dWlkIjogIjE0MzY1MTIzNjUxMjc0In0sCiAgICBbInN0YXJ0cy13aXRoIiwgIi 
R4LWFtei1tZXRhLXRhZyIsICIiXSwKICBdCn0K 
Your signature base-64 encoded is 2qCp0odXe7A9IYyUVqn0w2adtCA= 
Your signature encoded should be 2qCp0odXe7A9IYyUVqn0w2adtCA= 

だから、あなたのコードは動作しますが、私はちょうどあなたがわずかに異なる署名をしていると思いますポリシー(空白の違い)

関連する問題