Я хочу разрешить пользователям приложения iPhone загружать фотографии и использовать Amazon S3. Есть два способа, которые я вижу в этом:
- Загрузка с iPhone на мой сервер, который затем проксирует его на Amazon S3.
- Загрузка с iPhone прямо на S3
Для варианта 1 безопасность проста. Я никогда не должен рассказывать iPhone свой секрет S3. Даунсайд - это то, что все проксируется через наш сервер для загрузки, какие поражения идут в S3.
Для варианта 2, теоретически это лучше, но проблема заключается в том, как вы разрешаете iPhone (или любое мобильное приложение на другой платформе) записывать в мое ведро S3, не предоставляя ему мой секрет? Кроме того, я не уверен, что это хороший дизайн или нет, потому что поток будет: iphone загружается на S3, получает URL-адрес, а затем сообщает серверу, что URL-адрес, поэтому он может добавить его в нашу базу данных для ссылки в будущее. Однако, поскольку связь разделена на две части (iphone- > S3 vs iPhone- > My-Server), она оставляет ее хрупкой как неатомную операцию.
Я нашел более старую информацию, ссылаясь на Загрузка с помощью браузера с использованием POST, но не уверен, что это по-прежнему рекомендуемый подход. Я надеюсь на лучшее решение, где мы можем просто использовать API REST, а не полагаться на POST. Я также вижу AWS iOS Beta SDK, но их документы не помогли, и я нашел статья Amazon, которая была одинаково бесполезной, поскольку она предупреждает вас о том, что не делать, но не говорит вам об альтернативном подходе:
Мобильные AWS SDK подписывают API запросы, отправленные в Amazon Web Services (AWS), чтобы подтвердить личность учетной записи AWS, запрос. В противном случае, злонамеренный разработчик может легко делать запросы в другую инфраструктуру разработчика. Запросы подписываются с использованием AWS Идентификатор ключа доступа и секретный ключ доступа что обеспечивает AWS. Секретный доступ Ключ похож на пароль, и он крайне важно хранить секрет.
Совет. Вы можете просмотреть все свои AWS учетные данные безопасности, включая Access Идентификатор ключа и секретный ключ доступа на Веб-сайт AWS по адресу http://aws.amazon.com/security-credentials.
Включение учетных данных в исходный код является проблематичным для программного обеспечения, в том числе мобильных приложений, поскольку вредоносные пользователи могут декомпилировать программное обеспечение или просмотреть исходный код для извлечения Секретный ключ доступа.
Есть ли у кого-нибудь советы по наилучшему архитектурному дизайну и потоку?
Обновление: Чем больше я вникаю в это, кажется, что куча поплов рекомендует использовать метод HTTP POST с файлом политики json, как описано здесь: http://docs.amazonwebservices.com/AmazonS3/2006-03-01/dev/index.html?UsingHTTPPOST.html.
С этим потоком будет что-то вроде (1) iPhone делает запрос на мой сервер, запрашивая файл политики (2), сервер генерирует файл политики json и возвращает клиента (3) iPhone делает HTTP POST из фотографии + json политики для S3. Ненавижу, что я использую HTTP POST по-видимому kludgy, но он кажется лучше, потому что он устраняет необходимость моего сервера для хранения фотографии вообще.