2013-03-14 4 views
1

Это моя формаPOSTING к AWS S3 Подпись ошибок несовпадения

<html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    </head> 
    <body> 

    <form action="http://mybucket.s3.amazonaws.com/" method="post" enctype="multipart/form-data"> 
    Key to upload: <input type="input" name="key" value="user/eric/" /><br /> 
    <input type="hidden" name="acl" value="public-read" /> 



    <input type="hidden" name="AWSAccessKeyId" value="myAWSId" /> 
    <input type="hidden" name="Policy" value="Base64EncodingOfPolicy"/> 
    <input type="hidden" name="Signature" value="Signature Calculated as urlencode(base64(HMAC-SHA1(secret, policy base64 encoded string same as utf-8 encoded)))" /> 
    File: <input type="file" name="file" /> <br /> 
    <!-- The elements after this will be ignored --> 
    <input type="submit" name="submit" value="Upload to Amazon S3" /> 
    </form> 

</html> 

Это моя политика

{ "expiration": "2014-12-01T12:00:00.000Z", 

    "conditions": [ 

    {"acl": "public-read" }, 

    {"bucket": "mybucket" }, 

    ["starts-with", "$key", "user/eric/"], 

    ] 

} 

Это в формате base64 политика

eyAiZXhwaXJhdGlvbiI6ICIyMDE0LTEyLTAxVDEyOjAwOjAwLjAwMFoiLA0KDQogICJjb25kaXRp 
b25zIjogWw0KDQogICAgeyJhY2wiOiAicHVibGljLXJlYWQiIH0sDQoNCiAgICB7ImJ1Y2tldCI6 
ICJoYWJpdHN1c2VybWVkaWEiIH0sDQoNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRrZXkiLCAidXNl 
ci9lcmljLyJdLA0KDQogIF0NCg0KfQ== 

Я попытался с помощью base64 с строкой и без нее. Должен ли я держать что-то конкретное в виду при использовании вышеуказанной кодировки и новых строк?

Я продолжаю получать ошибку SignatureDoesNotMatch даже после нескольких попыток объяснить все возможные перестановки.

Я также использовал инструмент проверки подписи и проверил, что принимает AWS, и он соответствует. http://aws.amazon.com/code/199

Как я могу отладить это? Если вы успешно выполнили POST, используя REST API для S3, можете ли вы поделиться фрагментом?

ответ

1

Хорошо, я смог решить это через некоторое время.

Это мой питон код для создания подписи

import base64 
import hmac 
from hashlib import sha1 
import urllib 


input = open("policy.txt", "rb") 
policy = input.read() 
policy_encoded = base64.b64encode(policy).encode("UTF-8") 
secret = "<my_aws_secret>" 

print 'Encoded Policy %s' %(policy_encoded) 

hashed = hmac.new(secret,policy_encoded, sha1) 


#This is the required value 
signature = base64.b64encode(hashed.digest()) 

#This is not required for a HTTP POST form based request, only when it has to be passed in urlencoded format 
signature_urlencoded = urllib.quote_plus(base64.b64encode(hashed.digest())) 

print 'Signature urlencoded %s' %(signature) 

Мой policy.txt является

{ "expiration": "2014-12-01T12:00:00.000Z", 

"conditions": [ 

     {"acl": "public-read" }, 

     {"bucket": "<mybucket>" }, 

     {"success_action_status" : "201"}, 

     ["starts-with", "$key", "uploads/"], 
     ] 

} 

И моя форма выглядит

<form action="http://habitsusermedia.s3.amazonaws.com/" method="post" enctype="multipart/form-data"> 

       <input type="hidden" name="acl" value="public-read" /> 
       <input type="input" name="key" value="uploads/${filename}" /> 
       <input type="hidden" name="success_action_status" value="201" /> 

       <input type="hidden" name="AWSAccessKeyId" value="<aws_access_key>" /> 

       <input type="hidden" name="Policy" value="<policy_encoded_as_base64>"/> 

       <input type="hidden" name="Signature" value="<signature>" /> 

       File: <input type="file" name="file" /> <br /> 

       <!-- The elements after this will be ignored --> 
       <input type="submit" name="submit" value="Upload to Amazon S3" /> 
       </form> 

Убедитесь, что AWS ведро настроен для приема POSTS, PUT из любого домена. Для этого используйте инструмент создания политики.

Существует полезная статья, поясняющая эти понятия на AWS

Смежные вопросы