когда генерировать предварительно подписанные URL-адреса

#ios #amazon-s3 #boto3

#iOS #amazon-s3 #boto3

Вопрос:

У меня есть tableview, который извлекает данные из базы данных postgres на Heroku. Каждая ячейка tableview представляет аудиофайл, который хранится на S3. Я использую trackID то, что возвращается из postgres для каждой ячейки, чтобы получить доступ к аудиофайлу, создав URL, как показано ниже:

  let audioURL = "https://s3.amazonaws.com/<bucketname>/<trackID>.m4a"
 self.player!.audioPlayer = try AVAudioPlayer(contentsOf: audioURL)
 

Это приведет к ошибке, поскольку у меня нет прямого доступа к файлам S3. Я полагаю, что мне понадобится pre-signed urls from boto3 , чтобы иметь возможность отправлять GET запросы на файлы. Должен ли я генерировать предварительно подписанные URL-адреса при выборе файла для воспроизведения или я должен получать предварительно подписанные URL-адреса для каждого файла при выполнении моего первоначального запроса на выборку?

Ответ №1:

Предварительно подписанный URL-адрес — это способ предоставления временного доступа к частным объектам, которые хранятся в Amazon S3.

Предварительно подписанный URL-адрес состоит из:

  • URL-адрес файла
  • Ключ доступа, связанный с пользователем, у которого есть разрешения на ПОЛУЧЕНИЕ файла
  • Метка времени истечения срока действия
  • Хэшированная подпись, основанная на секретном ключе авторизованного пользователя (который сопоставляется с их ключом доступа)

Предварительно подписанный URL-адрес может быть сгенерирован из нескольких строк кода и вычисляется только при отправке запроса GET на Amazon S3.

При использовании Amazon S3 для извлечения объектов для веб-страницы предварительно подписанный URL-адрес должен быть сгенерирован на стороне сервера, чтобы учетные данные не отправлялись клиенту. Следовательно, предварительно подписанный URL-адрес будет сгенерирован во время создания HTML.

Однако, похоже, что вы кодируете для iOS. Поэтому существует два возможных сценария:

  • Вы можете создать временные учетные данные AWS с помощью службы маркеров безопасности AWS с разрешением на доступ ко всему соответствующему контенту в S3 в течение срока действия учетных данных, или
  • Вы могли бы попросить приложение iOS отправить запрос на серверную часть для получения файла, затем серверная часть проверяет, авторизован ли пользователь для доступа к файлу, и, если да, возвращает предварительно подписанный URL-адрес Amazon S3 для файла.

Первый метод снижает нагрузку на внутренний сервер, позволяя приложению iOS напрямую запрашивать контент у Amazon S3. Второй метод предоставляет возможность проверять каждый доступ к файлу перед предоставлением доступа и имеет то преимущество, что вы можете легко регистрировать каждый запрос.

Комментарии:

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

Ответ №2:

У предварительно подписанных URL-адресов есть время истечения срока действия, которое по умолчанию равно одному часу boto3 . Вероятно, вам будет лучше генерировать их по мере выбора файла.