Creo que he leído casi todo lo que hay que leer sobre la codificación base-64 de una firma para el navegador, publicación basada en formularios en S3: documentos antiguos y documentos nuevos. Por ejemplo:Python Generated Signature para S3 Post
http://doc.s3.amazonaws.com/proposals/post.html
E incluso encontrado esto:
http://s3.amazonaws.com/doc/s3-example-code/post/post_sample.html
En lugar de utilizar los anteriores o generador de la política reciente de Amazon, o ver alrededor de Boto, estoy tratando de elaborar una script .py más simple que extrae la política JSON de un archivo de texto plano (policy.txt), y luego genera la firma codificada base 64 necesaria para ayudarme a redactar el formulario HTML.
La firma en sí (que depende de la política codificada) NO se está codificando correctamente ... ¿tal vez debido a algún tipo de problema de utf-8 vs. ascii o \ n (nueva línea)?
El script con el que estoy trabajando está debajo, la política y la clave secreta de AWS private_key
son de un caso de prueba de AWS que estoy usando para ver si este script funciona. La firma codificada correctamente, citada por Amazon, se incluye en el siguiente script para referencia.
Puede alguien decirme por qué la firma según se especifica posteriormente no coincide con la firma de referencia proporcionado por Amazon ?:
En otras palabras:
Por qué esto está codificado correctamente:
policy_encoded = base64.b64encode(policy)
pero este NO es:
signature = base64.b64encode(hmac.new(private_key, policy_encoded, sha).digest())
PYTHON signature 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="
Política 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", ""]
]
}
Rik: ugh ...¡Lo siento mucho! ¡Ni siquiera los vi! :(Estaba teniendo dificultades para conseguir que el editor de SO aceptara el bloque JSON con sangrías. ¿Puede usted, en una palabra, decirme en qué debería centrarme para resolver esto ...? – Sean
Use 'Ctrl + K' para sangrar el bloque de códigos, agregará automáticamente 4 espacios, eche un vistazo a lo que he editado (haga clic en [x min ago] (http://stackoverflow.com/posts/9018767/revisions) para ver las revisiones anteriores). El código principal todavía está mal formateado y también hay '...' y también PALABRAS. También diría que su pregunta parece un poco "aterradora", la pregunta enfocada se resolverá con mayor probabilidad * (escribir buenas preguntas nunca es fácil)) * –
Muy bien. Gracias. Debidamente observado. Volví a sus ediciones, creo. Intentaré ajustarlo y hacerlo menos detallado. – Sean