Архитектурный и дизайнерский вопрос о загрузке фотографий из приложения iPhone и S3

Я хочу разрешить пользователям приложения для iPhone загружать фотографии и использовать Amazon S3. Я вижу два способа сделать это:

  1. Загрузить с iPhone на мой сервер, который затем проксирует его на Amazon S3.
  2. Загрузить с iPhone прямо на S3

Для варианта 1 безопасность проста. Мне никогда не нужно рассказывать iPhone свой секрет S3. Обратной стороной является то, что все проксируется через наш сервер для загрузки, что в некотором роде препятствует переходу на S3.

Для варианта 2 теоретически это лучше, но проблема в том, как разрешить iPhone (или любому мобильному приложению на другой платформе) писать в мое ведро S3, не сообщая ему моего секрета? Кроме того, я не уверен, хороший это дизайн или нет, потому что поток будет следующим: iphone загружается на S3, получает URL-адрес, затем сообщает серверу, что это за URL-адрес, чтобы он мог добавить его в нашу базу данных для использования в будущем. Однако, поскольку связь разделена на две части (iphone-> S3 против iPhone-> My-Server), она остается хрупкой, поскольку не является атомарной операцией.

Я нашел некоторую старую информацию, которая ссылается на Загрузка через браузер с использованием POST , но не уверен, что это все еще рекомендуемый подход. Я надеюсь на лучшее решение, в котором мы могли бы просто использовать REST API, а не полагаться на POST. Я также видел AWS iOS Beta SDK , но их документы не очень помогли, и я нашел статью Amazon , которая была столь же бесполезной, поскольку предупреждает вас о том, что не делать, но не предлагает альтернативный подход:

Мобильные SDK AWS подписывают API поскольку связь разделена на две части (iphone-> S3 против iPhone-> My-Server), она остается хрупкой, поскольку не является атомарной операцией.

Я нашел некоторую старую информацию, которая ссылается на Browser- на основе загрузок с использованием POST , но не уверен, что это все еще рекомендуемый подход. Я надеюсь на лучшее решение, в котором мы могли бы просто использовать REST API, а не полагаться на POST. Я также видел AWS iOS Beta SDK , но их документы не очень помогли, и я нашел статью Amazon , которая была столь же бесполезной, поскольку предупреждает вас о том, что не делать, но не предлагает альтернативный подход:

Мобильные SDK AWS подписывают API поскольку связь разделена на две части (iphone-> S3 против iPhone-> My-Server), она остается хрупкой, так как неатомарная операция.

Я нашел некоторую старую информацию, которая ссылается на Browser- Загрузки на основе POST , но не уверены, что это все еще рекомендуемый подход. Я надеюсь на лучшее решение, в котором мы могли бы просто использовать REST API, а не полагаться на POST. Я также видел AWS iOS Beta SDK , но их документы не очень помогли, и я нашел статью Amazon , которая была столь же бесполезной, поскольку предупреждает вас о том, что не делать, но не предлагает альтернативный подход:

Мобильные SDK AWS подписывают API Мы нашли некоторую старую информацию, которая ссылается на использование Загрузки через браузер с использованием POST , но не уверены, что это все еще рекомендуемый подход. Я надеюсь на лучшее решение, в котором мы могли бы просто использовать REST API, а не полагаться на POST. Я также видел AWS iOS Beta SDK , но их документы не очень помогли, и я нашел статью Amazon , которая была столь же бесполезной, поскольку предупреждает вас о том, что не делать, но не предлагает альтернативный подход:

Мобильные SDK AWS подписывают API Мы нашли некоторую старую информацию, которая ссылается на использование Загрузки через браузер с использованием POST , но не уверены, что это все еще рекомендуемый подход. Я надеюсь на лучшее решение, в котором мы могли бы просто использовать REST API, а не полагаться на POST. Я также видел AWS iOS Beta SDK , но их документы не очень помогли, и я нашел статью Amazon , которая была столь же бесполезной, поскольку предупреждает вас о том, что не делать, но не предлагает альтернативный подход:

Мобильные SDK AWS подписывают API запросы, отправленные в Amazon Web Services (AWS), чтобы проверить идентификатор учетной записи AWS, из которой запрос. В противном случае злонамеренный разработчик мог легко делать запросы в инфраструктуру другого разработчика. Запросы подписываются с помощью AWS. Идентификатор ключа доступа и секретный ключ доступа что предоставляет AWS. Секретный доступ Ключ похож на пароль, и он чрезвычайно важно хранить в секрете.

Совет: вы можете просматривать все свои AWS учетные данные безопасности, включая доступ Идентификатор ключа и секретный ключ доступа на Веб-сайт 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 явно неуклюжим, но, похоже, это лучше, потому что он вообще устраняет необходимость для моего сервера хранить фото.

48
задан TMC 19 December 2010 в 08:59
поделиться