Python Загрузка файла с использованием подписи S3? - PullRequest
1 голос
/ 15 января 2020

У меня есть сценарий использования для загрузки файлов с использованием S3 v4Signature . Эти загрузки должны быть выполнены с использованием python script .

S3 v4Signature передается нашим клиентам для загрузки n файлов в наше S3 ведро. Поскольку мы не знаем имени файла или числа, мы не можем сгенерировать подписанные URL для них.

Считайте, что это сгенерированная подпись V4. (Для простоты рассмотрим эту подпись, которую мы передали клиентам как печатную копию.)

key = "client/user_1/exec_1/",

s = {
  "url": "https://s3.amazonaws.com/package-bucket",
  "fields": {
    "acl": "public-read",
    "bucket": "package-bucket",
    "X-Amz-Algorithm": "AWS4-HMAC-SHA256",
    "X-Amz-Credential": "AKI****LV5P/20200115/us-east-1/s3/aws4_request",
    "X-Amz-Date": "20200115T183407Z",
    "Policy": "eyJleHBpcmF*******MTgzNDA3WiJ9XX0=",
    "X-Amz-Signature": "128c4************0c8d9",
  }
}

Теперь эта подпись должна использоваться сценарием Python для загрузки n файлов в клиент / user_1 / exec_1 / . Я пытался реализовать это с помощью запросов, но не повезло.

with open('index.js', 'rb') as data:
  r = requests.put(s.get('url'), data=data, headers=s.get('fields'))
  print(r)

Этот python скрипт выполняется на серверах нашего клиента. Предоставление им учетных данных для нашего s3 ведра невозможно.

Папки в нашем s3 выглядят так:

client/user_1/exec_1
client/user_1/exec_2
client/user_2/exec_1
client/user_2/exec_2
client/user_2/exec_3
client/user_2/exec_4

После загрузки файлов мы обрабатываем их на наших серверах.

Примечание: Внешний интерфейс не участвует во всем процессе.

Может кто-нибудь предложить функцию для загрузки файлов в s3?


Функция, используемая для генерации подписи.

function singleFilePublicUpload(key) {
  console.log("singleFilePublicUpload | Signature Request", key);
  const Bucket = 'package-bucket';
  const acl = "public-read";
  const params = { 
    Bucket, Fields: { acl }, Conditions: [['starts-with', '$key', key]]
  };
  const presignedPost = s3.createPresignedPost(params);
  presignedPost.fields.key = key;
  return presignedPost;
}

FAQ

Q: Где выполняется сценарий Python?

A: Python Сценарий загрузки выполняется на разных клиентских серверах.

В: Он выполняется вами, вашим пользователем или вашим клиентом?

A : Python Сценарий загрузки выполняется клиентами.

В: Или это бэкэнд веб-сайта, к которому ваши пользователи будут иметь доступ?

A: Нет. Веб-сайт не вовлечен в процесс.

В: Как вы хотите, чтобы они проходили аутентификацию, чтобы доказать, что им разрешено загружать на S3?

A: Мы хотим дать им доступ s в папку S3 с использованием подстановочной подписи.

В: Вы говорите, что не хотите sh использовать boto, потому что ему нужны разрешения AWS, так как вы собираетесь авторизовать загрузку на S3?

A: Мы хотим, чтобы наш клиент отправлял запрос POST непосредственно в S3, используя предоставленную подпись. Подпись V4 должна авторизовать прямую загрузку на S3.

Ответы [ 2 ]

2 голосов
/ 15 января 2020

Вы можете использовать boto3 python библиотека:

import boto3

client = boto3.client('s3')
response = client.put_object(Bucket='your_bucket', Key='your_key')
1 голос
/ 17 января 2020

A рекомендуемая архитектура для этого:

  • Не не используйте учетные данные IAM для своих пользователей. Они предназначены только для вашего внутреннего использования.
  • Пусть пользователи аутентифицируют в вашем веб-приложении. Приложение проверяет их подлинность (используя Cognito или как вы sh).
  • Затем приложение отображает страницу, на которую они могут загрузить файл, используя предварительно подписанный URL-адрес . Это ограниченный по времени URL-адрес, который разрешает загрузку в рамках заданных ограничений (например, где его хранить, какое имя использовать).

Это безопасный способ авторизации загрузки только для аутентифицированных пользователей.

См .: Загрузка объектов с использованием предопределенных URL-адресов - Amazon Simple Storage Service

Изменение для Python

Если вы специально wi sh их для загрузки через Python, вы можете:

  • сделать так, чтобы приложение Python (запущенное на клиентском сайте) проходило аутентификацию с вашим приложением
  • Приложение может затем используйте AWS Security Token Service (STS) для создания временных учетных данных с разрешением загрузки в Amazon S3
  • Приложение Python затем использует эти учетные данные с помощью boto3 для загрузки файла

Этот метод также обеспечивает загрузку в корзину только аутентифицированных пользователей.

Итог: Вы не можете предоставить подпись потому что это зависит от загружаемого файла. Однако вы можете предоставить временные учетные данные или предварительно подписанный URL-адрес, чтобы разрешить загрузку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...