2012-05-27 17 views
5

Ich habe jetzt drei Tage damit verbracht, ein einfaches Buchungsformular für Amazon S3 zu erstellen. Jedesmal, wenn ich bekomme diese Fehlermeldung:Formulardaten an Amazon S3-Bucket senden

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

Ich sehe das Problem nicht. :-(

<?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> 

ersetzt ich den Eimer Namen sowie die privaten und öffentlichen Schlüsseln über

ich die Anweisung folgte die Politik sorgfältig zu unterzeichnen. http://docs.amazonwebservices.com/AmazonS3/2006-03-01/dev/HTTPPOSTForms.html#HTTPPOSTConstructPolicy

Was bin ich? Warum funktioniert der Code nicht

Antwort

-1

okay, ich es endlich geschafft, dies zu tun bekommen diesen Beispielcode-Bibliothek: http://aws.amazon.com/code/Amazon-S3/1618

+0

Btw, der Browser/Betriebssystem stürzte ab, weil ich Formularfelder sendete, die nicht in der Richtlinie waren. Nach dem Hinzufügen von x-ignore zu den Feldern funktionierte es. Keine Ahnung, warum das einen Absturz verursacht hat. – reggie

+3

Sie sollten die Antwort akzeptieren, die tatsächlich die Lösung des Problems enthält. –

-1

Bereits beantwortet Ihre eigene Frage, die ich realisiere, aber ich frage mich, ob dieses Tutorial (http://aws.amazon.com/articles/1434), die Sie die Zeichen aus dem JSON ausziehen vor dem Ausführen der Basis 64 Codierung ist die Wurzel des Problems vorschlagen?

16

Es gibt keine Notwendigkeit für diese Bibliothek, Sie haben nur einen Parameter fehlt. Das Problem besteht darin, dass Sie die Funktion hash_hmac nicht für die Ausgabe von Binärdaten festgelegt haben. Um dies zu tun, stellen Sie den vierten Parameter auf true wie so:

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

Wenn Sie dies nicht gesetzt ist, wird es nicht sein, das Codieren der Unterschrift die Art und Weise, dass AWS erwartet zu sein.

+0

Ich hatte genau das gleiche Problem und das war genau das, was ich brauchte. Vielen Dank. (Dies sollte die akzeptierte Antwort sein.) –

+0

Dito. Und ja, das sollte die akzeptierte Antwort sein, da es die ursprüngliche Frage klar gelöst hat. Naja! Habe trotzdem eine Verbesserung. –