Создание StringToSign - PullRequest
       4

Создание StringToSign

2 голосов
/ 03 сентября 2011

Я читаю документацию о передаче строки запроса в Amazon S3 для аутентификации и не могу понять, как именно создается и используется StringToSign.Я ищу конкретный пример, чтобы проиллюстрировать (1), как построить StringToSign, и (2), как только у меня есть подпись, как вызвать форму.

Для примера, скажем, следующеемоя информация:

Content-type='image/jpeg'
Bucket='test-bucket'
Key = 'filename'
ACL = 'public-read'
Expiration = '(never expires)'
Access Key = '12345'
Secret Password = '1a2b3c'
File = <file the user uploads>

Как мне получить значение StringToSign из этого?И как только я получу это, как мне создать следующую форму:

<form action="??" method="post" enctype='multipart/form-data' class="upload-form">
    <input name="file" type="file"> 
</form>

И для справки: http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?RESTAuthentication.html#RESTAuthenticationQueryStringAuth. Спасибо.

1 Ответ

2 голосов
/ 03 сентября 2011

Судя по тому, что вы описали, кажется, что вы хотите поддерживать загрузку через браузер с помощью POST.Существует раздел документации AWS, в котором говорится об этом .

. В качестве обзора следует помнить, что вы должны либо сделать свою корзину общедоступной для записи, либо включить документ политики.Я предполагаю, что вы включите документ политики (проверьте документы, если не хотите):

Документ политики - это просто фрагмент JSON, который используется для аутентификации запроса, и даеткуча условий, которые должны быть выполнены перед загрузкой данных.Например:

"expiration": "2020-12-01T12:00:00.000Z",
"conditions": [
    {"acl": "public-read" },
    {"bucket": "test-bucket" },
    ["eq", "$key", "filename"],
  ]
}

Это говорит о том, что действие для загрузки будет разрешено до 2020 года, учитывая, что корзина доступна только для публичного чтения, имя корзины - 'test-bucket', а ключ точно равен 'filename'.

Теперь, чтобы создать свою подпись, вы берете вышеупомянутый документ JSON, кодируете его в UTF-8, затем base64, а затем подписываете все это, используя свой секретный ключ доступа (используя hmac sha1), и, наконец, base64, которыйвсе это

policy_data = ... # stuff above
enc_policy = base64.b64_encode(policy_data.encode('utf8'))
signed = base64.b64_encode(hmac.new(AWS_SECRET, enc_policy, hashlib.sha1))

Тогда, наконец, ваша форма будет выглядеть примерно так:

 <form action="http://test-bucket.s3.amazonaws.com/" method="post" enctype="multipart/form-data">
    Key to upload: <input type="input" name="key" value="filename" /><br />
    <input type="hidden" name="acl" value="public-read" />
    <input type="hidden" name="success_action_redirect" value="http://test-bucket.s3.amazonaws.com/successful_upload.html" />
    Content-Type: <input type="input" name="Content-Type" value="image/jpeg" /><br />
    <input type="hidden" name="AWSAccessKeyId" value="YOUR_ACCESS_KEY_ID" />
    <input type="hidden" name="Policy" value="<enc_policy from above>" />
    <input type="hidden" name="Signature" value="<signed from above>" />
    File: <input type="file" name="file" /> <br />
    <!-- The elements after this will be ignored -->
    <input type="submit" name="submit" value="Upload to Amazon S3" />
  </form>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...