2012-05-27 15 views
5

He pasado tres días tratando de configurar un formulario de publicación simple para amazon s3. Cada vez que sale este error:Publicación de datos del formulario en el cubo de Amazon S3

SignatureDoesNotMatchThe request signature we calculated does not match the signature you provided. Check your key and signing method.

no veo el problema. :-(

<?php 
     $form = array(
      'key'      => 'queue/1_1_1234567890.wmv', 
      'AWSAccessKeyId'   => 'mypublickeyishere', 
      'acl'      => 'public-read', 
      'success_action_redirect' => 'http://someurl.com', 
     ); 

     $form['policy'] = '{ 
      "expiration": "2015-12-01T12:00:00.000Z", 
       "conditions": [ 
        { 
         "acl": "'.$form['acl'].'" 
        }, 
        { 
         "success_action_redirect": "'.$form['success_action_redirect'].'" 
        }, 
        { 
         "bucket": "thenameofmybucket" 
        }, 
        [ 
         "starts-with", 
         "$key", 
         "queue/" 
        ] 
       ] 
      }'; 

    $form['policy_encoded'] = base64_encode($form['policy']); 
    $form['signature'] = base64_encode(hash_hmac('sha1', base64_encode(utf8_encode($form['policy'])), 'F90mc5kpjuNMPg8XG7iV6bxOzacYhktcw+RVGzpZ')); 

?> 


<form action="https://thenameofmybucket.s3.amazonaws.com/" method="post" enctype="multipart/form-data"> 
     <input type="hidden" name="key" value="<?php echo $form['key'] ?>"> 
     <input type="hidden" name="AWSAccessKeyId" value="<?php echo $form['AWSAccessKeyId'] ?>"> 
     <input type="hidden" name="acl" value="<?php echo $form['acl'] ?>"> 
     <input type="hidden" name="success_action_redirect" value="<?php echo $form['success_action_redirect'] ?>"> 
     <input type="hidden" name="policy" value="<?php echo $form['policy_encoded'] ?>"> 
     <input type="hidden" name="signature" value="<?php echo $form['signature'] ?>"> 

     File to upload to S3: 
     <input name="file" type="file"> 
     <br> 
     <input type="submit" value="Upload File to S3"> 
</form> 

Me sustituyan el nombre de depósito, así como las claves privadas y públicas anteriores

que siguieron las instrucciones para firmar la política meticulosamente:. http://docs.amazonwebservices.com/AmazonS3/2006-03-01/dev/HTTPPOSTForms.html#HTTPPOSTConstructPolicy

¿Qué me falta? ¿Por qué es el código no funciona

Respuesta

-1

bien, finalmente pude conseguir este hecho uso de esta biblioteca de código de ejemplo:? http://aws.amazon.com/code/Amazon-S3/1618

+0

Por cierto, el navegador/sistema operativo estaba fallando, porque estaba enviando campos de formulario que no estaban en la política. Después de agregar x-ignore- a los campos, funcionó. No tengo idea de por qué eso causó un accidente. – reggie

+3

Debe aceptar la respuesta que realmente contiene la solución al problema encontrado. –

-1

Ya he respondido tu propia pregunta, pero me pregunto si este tutorial (http://aws.amazon.com/articles/1434), que sugiere que tienes que quitar los caracteres de retorno de json antes de hacer la codificación base 64 es la raíz del problema?

16

No hay necesidad de esa biblioteca, solo le faltaba un parámetro. El problema es que no ha configurado la función hash_hmac para generar datos binarios. Para ello, establezca el cuarto parámetro a true así:

$signature = base64_encode(hash_hmac('sha1', $policy_b64, $secret, true)); 

Si no se establece esto, no habrá que codifica la firma de la forma en que AWS espera que sea.

+0

Tenía exactamente el mismo problema y esto era exactamente lo que necesitaba. Gracias. (Esta debería ser la respuesta aceptada). –

+0

Ídem. Y sí, esta debería ser la respuesta aceptada, ya que resolvió claramente la pregunta original. ¡Oh bien! Tener un voto positivo de todos modos. –

Cuestiones relacionadas