2012-05-27 3 views
5

Я потратил три дня, пытаясь создать простую форму для отправки на amazon s3. Everytime я получаю эту ошибку:Публикация данных формы в ковш Amazon S3

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

Я не вижу проблемы. :-(

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

я заменил имя ковша, а также секретные и открытые ключи выше

Я выполнил указание подписать политику тщательно:. http://docs.amazonwebservices.com/AmazonS3/2006-03-01/dev/HTTPPOSTForms.html#HTTPPOSTConstructPolicy

Что я упускаю? Почему код не работает

ответ

-1

Хорошо, я, наконец, удалось получить это сделать, используя этот пример библиотеки кода: http://aws.amazon.com/code/Amazon-S3/1618

+0

Btw, браузер/операционная система терпела крах, потому что я отправлял поля формы, которые не были в политике. После добавления x-ignore- в поля это сработало. Не знаю, почему это вызвало крах. – reggie

+3

Вы должны принять ответ, который фактически содержит решение возникшей проблемы. –

-1

Уже ответил на ваш собственный вопрос. Я понимаю, но я задаюсь вопросом, не является ли этот урок (http://aws.amazon.com/articles/1434), который предполагает, что вам нужно вычеркнуть возвращаемые символы из json, прежде чем делать базовую кодировку 64 - это корень проблемы?

16

В этой библиотеке нет необходимости, вы просто не указали параметр. Проблема в том, что вы не установили функцию hash_hmac для вывода двоичных данных. Чтобы сделать это, установите четвертый параметр для true следующим образом:

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

Если вы не установили это, он не будет кодирующая подпись, так, что AWS ожидает, что это будет.

+0

У меня была точно такая же проблема, и это было именно то, что мне нужно. Благодарю. (Это должен быть принятый ответ.) –

+0

То же. И да, это должен быть принятый ответ, поскольку он четко разрешил исходный вопрос. Ну что ж! Все равно. –

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