2012-05-27 13 views
5

Spędziłem trzy dni próbując skonfigurować prosty formularz wysyłania wiadomości do amazon s3. Everytime I dostać ten błąd:Publikowanie danych formularza na wiadrze Amazon S3

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

nie widzę problemu. :-(

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

I podstawiony nazwę wiadro, jak również prywatne i publiczne klucze powyższe

I przestrzegać instrukcji do podpisania politykę skrupulatnie. http://docs.amazonwebservices.com/AmazonS3/2006-03-01/dev/HTTPPOSTForms.html#HTTPPOSTConstructPolicy

Czego mi brakuje? Dlaczego kod nie działa?

Odpowiedz

-1

OK, w końcu udało mi się to zrobić za pomocą tej przykładowej biblioteki kodów: http://aws.amazon.com/code/Amazon-S3/1618

+0

Btw, przeglądarka/system operacyjny zawiesza się, ponieważ wysyłałem pola formularza, które nie znajdowały się w polityce. Po dodaniu x-ignore- do pól zadziałało. Nie mam pojęcia, dlaczego to spowodowało awarię. – reggie

+3

Powinieneś zaakceptować odpowiedź, która rzeczywiście zawiera rozwiązanie napotkanego problemu. –

-1

Już odpowiedziałem na własne pytanie zdałem sobie sprawę, ale zastanawiam się, czy ten tutorial (http://aws.amazon.com/articles/1434), który sugeruje, że trzeba usunąć znaki powrotu z json przed wykonaniem kodowania base 64 jest źródłem problemu?

16

Nie ma potrzeby tej biblioteki, po prostu brakowało parametru. Problem polega na tym, że nie ustawiłeś funkcji hash_hmac na wyprowadzanie danych binarnych. Aby to zrobić, należy ustawić parametr czwarty do true tak:

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

Jeśli nie ustawić to, że nie będzie kodowania podpisu sposób, że AWS oczekuje, że będzie.

+0

Miałem dokładnie ten sam problem i to było dokładnie to, czego potrzebowałem. Dzięki. (To powinna być zaakceptowana odpowiedź.) –

+0

Ditto. I tak, to powinna być zaakceptowana odpowiedź, ponieważ wyraźnie rozwiązała pierwotne pytanie. No cóż! Mimo to przekaż sprawę. –