Получение недопустимого документа политики или ошибка заголовков запроса при использовании Fineuploader для amazon s3

Я пытаюсь использовать новую функцию FineUploader, позволяющую напрямую загружать файлы на amazon s3. В настоящее время я не могу загружать фотографии. Я получаю сообщение об ошибке: "Неверный документ политики или заголовки запроса!"

Разработчики попросили публиковать вопросы здесь, в stackoverflow.

Я следую их инструкциям на этой странице:

http://blog.fineuploader.com/2013/08/16/fine-uploader-s3-upload-directly-to-amazon-s3-from-your-browser/#guide

При настройке я также эмулировал файл примера, связанный с ним: https://github.com/Widen/fine-uploader-server/blob/master/php/s3/s3demo.php

У меня настроен javascript с очень небольшим количеством опций:

$('#fineuploader-s3').fineUploaderS3({
          request: {
              endpoint: "http://thenameofmybucket.s3.amazonaws.com",
              accessKey: “mypublicaccesskey”
          },

          signature: {
              endpoint: "s3demo.php"
          },

          iframeSupport: {
              localBlankPagePath: "/success.html"
          },

         cors: {
              expected: true
          }
  });

Я знаю, что есть много мест, где это могло пойти не так для меня. Я никогда раньше не использовал s3 или Fineuploader, так что извините, если это глупые вопросы. Но вот места, где я больше всего запутался в настройке. У меня такое ощущение, что проблема заключается в № 1:

(1) В примере javascript путь к подписи настраивается следующим образом:

// REQUIRED: Path to our local server where requests can be signed.
          signature: {
        endpoint: "/s3/signtureHandler"
          },

Я не был уверен, что это пустой файл, в котором создается некоторый json, или он должен указывать на php-скрипт, где функция для создания json, в моем случае s3demo.php, которую я скопировал напрямую.

(2) В файле s3demo.php я изменил только следующие строки:

$clientPrivateKey = $_SERVER['I put my private key here'];

$expectedBucket = "http://thenameofmybucket.s3.amazonaws.com";

function handlePreflightedRequest() {
    // If you are relying on CORS, you will need to adjust the allowed domain here.
    header('Access-Control-Allow-Origin: http://mywebsitename.org');
}

(3) Это то, что у меня есть для моего файла CORS, я не был уверен, правильно ли это, потому что примеры на странице с инструкциями не включают теги:

<CORSRule>
        <AllowedOrigin>http://mywebsitename.org</AllowedOrigin>
        <AllowedMethod>POST</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>

(4) Как указано в инструкции, я зашел в панель IAM и создал группу с политикой, точно скопированной из инструкции, но с фактическим названием моей корзины:

{
  "Version":"2012-10-17",
  "Statement":[{
     "Effect":"Allow",
     "Action":"s3:PutObject",
     "Resource":"arn:aws:s3:::thenameofmybucket/*”
   }]
}

, затем пользователь, от которого я получил открытый и закрытый ключи доступа, используемые в файлах javascript и php соответственно. Имя пользователя специально нигде в сценариях не используется.

Я надеюсь, что есть что-то действительно очевидное, что я сделал здесь неправильно. Спасибо за ваше время.


person E Blair    schedule 20.08.2013    source источник
comment
Чтобы ответить на вопрос (1). Параметр signature.endpoint должен указывать на php-скрипт.   -  person Mark Feltner    schedule 21.08.2013


Ответы (1)


Если я правильно понимаю, вы видите сообщение «Недействительный документ политики...» на стороне клиента при попытке подписать запрос на простую загрузку. Вы также используете s3demo.php предоставлен пример PHP на стороне сервера.

Самая большая проблема, которую я вижу с вашими изменениями, это переменная $expectedBucket. Ваш сегмент не "http://thenameofmybucket.s3.amazonaws.com", а "thenameofmybucket". Скорее всего, код на стороне сервера отклоняет политику, так как ожидает корзину с именем "http://thenameofmybucket.s3.amazonaws.com", когда я уверен, что ваше ведро на самом деле называется "thenameofmybucket". Измените эту строку на $expectedBucket = "thenameofmybucket";.

Кроме того, неясно, где вы храните секретный ключ на стороне клиента, исходя из вашего вопроса. Если ваш секретный ключ, скажем, «12345», есть ли у вас строка кода, похожая на эту?

$clientPrivateKey = $_SERVER['12345'];

Если это так, это еще одна проблема с вашим кодом на стороне сервера. Суперглобальная переменная $_SERVER в PHP ищет переменную окружения с именем "12345", которая, предположительно, содержит ваш секретный ключ. Если вы не настроили такую ​​переменную, то либо сделайте это, либо, возможно, просто установите значение $clientPrivateKey в свой секретный ключ.

Кроме того, вы действительно работаете в среде с разными источниками происхождения? Это не похоже на тебя. Если это так, вам не нужны никакие вещи, помеченные как «CORS», «кросс-происхождение» или «кросс-доменный» в примере с PHP.

ОБНОВЛЕНИЕ:
Вам также следует установить для параметра $expectedMaxSize global значение null, если вы не устанавливаете никаких ограничений на размер загружаемых файлов. Сейчас мы обновляем пример PHP для Fine Uploader S3. с некоторыми улучшениями и разъяснениями, которые должны помочь другим в будущем.

person Ray Nicholus    schedule 20.08.2013
comment
Спасибо, что поймали все эти ошибки. Я изменил $expectedBucket и исправил строку кода с помощью своего ключа. Но я все еще получаю ту же ошибку, так что я думаю, что что-то еще не так. - person E Blair; 21.08.2013
comment
Спасибо, что спросили, к сожалению, нет. Нужно ли удалять часть кода, связанного с CORS, из примера php? - person E Blair; 21.08.2013
comment
Это зависит. Хотя, наверное, нет. Какую проблему вы видите сейчас? Опубликуйте обновление на свой вопрос с описанием ошибки, которую вы видите, и журналами вашей клиентской консоли. Вам также, вероятно, будет полезно добавить параметр debug со значением true перед сбором журналов на стороне клиента. - person Ray Nicholus; 21.08.2013
comment
Я присоединился к чату, как вы просили, но я не думаю, что смогу там говорить, потому что мне нужна репутация 20? Возможно, я не понимаю, как пользоваться чатом. - person E Blair; 21.08.2013
comment
Эта ошибка указывает на то, что с вашим серверным кодом все еще что-то не так. Похоже, вы не устанавливаете никаких правил проверки, таких как максимальный размер. Итак, я предполагаю, что код на стороне сервера не видит ожидаемого ограничения максимального размера 15 МБ в документе политики (поскольку вы не устанавливаете это правило на стороне клиента) и отклоняет политику. Если вы не устанавливаете ограничение на размер файла на стороне клиента, вам следует удалить эту проверку из кода на стороне сервера. - person Ray Nicholus; 21.08.2013
comment
Какая-то ошибка в stackoverflow, по-видимому, не позволяет вам присоединиться к чату. Извини. Не знаю, почему ваш представитель не обновляется в чате. Надеюсь, мой комментарий о максимальном размере решит вашу проблему. Скорее всего проблема в этом. - person Ray Nicholus; 21.08.2013
comment
Я постараюсь не принимать на свой счет то, что переполнение стека не думает, что я действительно оцениваю 20. В любом случае, да, это было именно так. Я отключил проверку на стороне клиента, чтобы максимально упростить тестирование. Когда я закомментировал строку кода в параметре php-файла expectMaxSize, это полностью сработало. Большое спасибо. - person E Blair; 21.08.2013
comment
Рад слышать. Вероятно, вам следует просто установить $expectedMaxSize global в null вместо того, чтобы комментировать код проверки размера. Это тоже должно работать. Ваш вопрос побудил нас внести некоторые изменения в пример PHP. На следующий день мы обновим репозиторий на стороне сервера новыми примерами PHP. - person Ray Nicholus; 21.08.2013