#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
. Вероятно, вам будет лучше генерировать их по мере выбора файла.