2012-04-05 2 views
1

Я пытаюсь загрузить файлы в Google Cloud Storage через HTML-форму через метод POST. Google заявляет в своем documentation, что для назначения нестандартного ACL вам необходимы как правило, так и поле подписи.Создать документ и подпись Google Cloud Storage Документ и подпись

Чтение их описаний о том, как сгенерировать эти значения, кажется довольно простым. К сожалению, после многих попыток я все еще не могу генерировать значения, которые будут проходить фильтры Google. Я постоянно получаю ошибки, говоря, что моя подпись не соответствует политическому документу.

Может ли кто-нибудь проинструктировать меня, где я ошибаюсь? Это мой процесс:

  1. Построить свой программный документ

Это легкая часть. Мой документ политика:

{"expiration": "2015-06-16T11:11:11Z", 
"conditions": [ 
    ["starts-with", "$key", ""], 
    {"acl": "public-read" }, 
    {"bucket": "publicjs"}, 
    {"success_action_redirect": "http://localhost/gcs.php" } 
] } 
  1. Я тогда пошел в this website и закодировал выше значение в base64. Это то, что я использую в качестве своего политического документа.

  2. Теперь для подписи. Мне нужно зашифровать свой документ политики с помощью моего секретного ключа в качестве ключа шифрования, поэтому я пошел к this website, чтобы выполнить шифрование. Я ввел свой документ с закодированной политикой base64 (с шага 2) в основную текстовую область и мою функциональную возможность «Секретный» ключ в поле ключа.

  3. Нажмите Enter, а значение рядом с base64 должно быть значение подписи.

  4. Положите значения в форму, отправьте запрос POST, получите ошибку.

Куда я иду не так?

ответ

4

Последовательность кодирования должна выглядеть следующим образом:

  • base64 закодировать документ политики (назовём, что кодированный политика)

  • генерировать хэш SHA1 (только для ключей для взаимодействия с другими, если использовать SHA256 вы хотите использовать ключ RSA) закодированной политики и base64 кодировать то, что (назовем это сигнатурой)

  • отправить закодированную политику и подпись в форме post request (вдоль с остальной частью формы)

Вот идеализированный реализация последовательности в Python:

POLICY = '''{ 
       "expiration": "2015-06-16T11:11:11Z", 
       "conditions": [ 
        ["starts-with", "$key", "test"], 
        {"acl" : "public-read"} 
       ] 
       }''' 

    GEN_FORM = ''' 
    <form action="%s" method="post" enctype="multipart/form-data"> 
     <input type="hidden" name="acl" value="public-read"> 
     <input type="hidden" name="bucket" value="YOUR_BUCKET"> 
     <input type="hidden" name="key" value="YOUR_OBJECT_NAME"> 
     <input type="hidden" name="GoogleAccessId" value="YOUR_ACCESS_ID"> 
     <input type="hidden" name="policy" value="%s"> 
     <input type="hidden" name="signature" value="%s"> 
     <input name="file" type="file"> 
     <input type="submit" value="Upload"> 
    </form> 
    ''' 

    encoded_policy = base64.b64encode(POLICY).strip() 
    h = hmac.new(YOUR_SECRET_KEY, digestmod=sha.sha) 
    h.update(encoded_policy) 
    signature = base64.b64encode(h.digest()) 
    gen_html = GEN_FORM % (url, encoded_policy, signature) 
+0

На самом деле получил это выяснили. Я случайно делал SHA256 (как указано в документации Google), но SHA1 действительно то, что требуется. Кроме того, если я использую «ключ» вместо «$ key», я получаю недопустимые ошибки политики. – jwegner

+0

При использовании ключа функциональной совместимости требуется хэш SHA1, но при использовании ключа RSA требуется SHA256. Я думаю, что документ, на который вы ссылаетесь, предполагает RSA, но это может быть более ясным в этом вопросе (я написал запрос, чтобы исправить это).Вы правы в знаках доллара, они не принадлежат при использовании имен полей, но они необходимы при использовании условных выражений, которые вы используете здесь. Я обновил свой код, чтобы отразить эту коррекцию, чтобы я не вводил в заблуждение посетителей этой темы. Спасибо, Джозеф! –

+0

@MarcCohen У меня есть невозможное время, пытаясь заставить подписи работать (ПРИМЕЧАНИЕ. Я пытаюсь использовать ключи функциональной совместимости и SHA1, как и ваш пример). Все, что я когда-либо получаю, это «SignatureDoesNotMatch». Похоже, что если моя строка POLICY имеет какую-либо разницу в пробелах, чем одна группа Google, то это полностью изменит окончательную подпись, и они не совпадут. Как я узнаю, что моя строка политики имеет точный ожидаемый формат одного Google, скомпонованного перед кодировкой/подписью? –

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

  • Нет связанных вопросов^_^