API облаков с JavaScript (Amazon, Azure)

Я изучаю возможность использования некоторого облачного хранилища непосредственно из клиентского JavaScript. Однако я столкнулся с двумя проблемами:

  • Безопасность. Архитектура обычно создается на основе облачного клиента, поэтому есть один ключ API (например). Это проблематично, так как мне нужна безопасность для моего пользователя. Я не могу дать тот же ключ API всем моим пользователям.

  • Междоменный AJAX. Есть HTTP-заголовки, которые браузеры могут использовать, чтобы иметь возможность выполнять междоменные запросы, но это означает, что я должен был бы установить их на облако сторона. Но единственное, что мне нужно для работы: , чтобы добавить пользовательский заголовок ответа HTTP: Access-Control-Allow-Origin: otherdomain.com.

Мой сценарий включает в себя множество простых сообщений очереди от JS-клиента, и я думал, что буду использовать облако, чтобы избавиться от этого трафика от моего основного хостинг-провайдера. Windows Azure имеет эту часть обслуживания очереди, которая кажется довольно близкой к тому, что мне нужно, за исключением того, что я не знаю, можно ли решить эти проблемы.

Любые мысли? Мне кажется, что JavaScript-клиенты для облачных сервисов являются неизбежными сценариями в ближайшем будущем.

Итак, существует ли облачное хранилище с REST API, которое предлагает управление аутентификацией клиентов и не дает им ключ API?

Ответ 1

В хранилище Windows Azure Blob имеется понятие Подпись общего доступа (SAS), которое может быть выпущено на стороне сервера и по существу специальный URL-адрес, с которым клиент мог писать, без прямого доступа к ключу API учетной записи хранилища. Это единственный механизм в Windows Azure Storage, который позволяет записывать данные без доступа к ключу учетной записи хранилища.

Срок действия SAS может быть истек (например, предоставить пользователю 10 минут для использования URL-адреса SAS для загрузки) и может быть настроен для разрешения отмены доступа даже после выпуска. Кроме того, SAS может быть полезен для ограниченного доступа к чтению (например, дать пользователю 1 день для просмотра этого видео).

Если ваш браузер JavaScript также работает в браузере, у вас могут быть проблемы с междоменным доступом. У меня есть две мысли - ни проверенные! Одна мысль JSONP - стиль (хотя это будет ограничено вызовами HTTP GET). Другая (более перспективная) мысль заключается в размещении файлов .js в хранилище blob вместе с вашими файлами данных, чтобы они находились в одном домене (надеюсь, что ваш веб-браузер счастлив).

"Реальное" решение может быть совместным использованием ресурсов Cross-Origin (CORS), но это недоступно в Windows Azure Blob Storage, и все еще появляется (наряду с другими возможностями HTML 5) в браузерах.

Ответ 2

Да, вы можете это сделать, но не хотите, чтобы ваш лазурный ключ был доступен на стороне клиента, чтобы javascript мог напрямую обращаться к очереди.

Я хотел бы, чтобы javascript говорил с веб-службой, которая могла проверять права доступа для пользователя и разрешать/запрещать отправку сообщения в очередь.

Таким образом, javascript мог бы только говорить с веб-службами и оставлять веб-службы обрабатывать разговоры с очередями.

Его слишком большой предмет для публикации кода, но, надеюсь, этого достаточно, чтобы вы начали.

Ответ 3

Это можно сделать с помощью Amazon S3, но не Azure в данный момент, я думаю. Причина этого в том, что S3 поддерживает CORS.

http://aws.amazon.com/about-aws/whats-new/2012/08/31/amazon-s3-announces-cross-origin-resource-sharing-CORS-support/

но Azure пока не работает. Кроме того, из вашего вопроса это звучит так, как решение для массового обслуживания - это то, что вы хотите, что предлагает Amazon SQS, но SQS также не поддерживает CORS.

Если вам нужна сложная семантика очереди (например, срок действия сообщения или длительный опрос), то S3, вероятно, не является решением для вас. Однако, если ваши требования к очередности просты, тогда подходит S3.

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

http://docs.aws.amazon.com/AmazonS3/latest/dev/S3_QSAuth.html

Оптимальным способом может быть перенаправление службы на URL аутентификации строки запроса.

Для тех, кто задается вопросом, почему это хорошая вещь, это означает, что вам не нужно передавать все содержимое объектов S3 через ваш вычислительный уровень. Вы просто генерируете аутентифицированный URL строки запроса (по существу, только подписанную строку), что является очень дешевой операцией, а затем полагаться на массивную масштабируемость, предоставляемую S3 для фактической загрузки/загрузки.

Обновление:. По состоянию на ноябрь этого года Azure теперь поддерживает CORS для хранения таблиц, очереди и памяти.

http://msdn.microsoft.com/en-us/library/windowsazure/dn535601.aspx

Ответ 4

Я думаю, что существующие поставщики услуг не позволяют запрашивать хранилище непосредственно у клиента. Поэтому, чтобы решить проблемы:

  • вы можете написать простой Сервер и открыть REST apis, которые аутентифицируются на основе APIKey, переданных в качестве параметра запроса, и возвращают ваши конкретные данные вашему клиенту.
  • Имейте встроенный iframe и вызовите 2-й домен из iframe. Получите возвращаемый JSON/XML в родительском фрейме и обработайте данные.

Обновление: Похоже, Google уже решает вашу проблему. Отметьте этот вне.

В https://developers.google.com/storage/docs/json_api/v1/libraries проверьте раздел Google Cloud Storage JSON API client libraries.

Ответ 5

С Amazon S3 и Amazon IAM вы можете создавать очень мелкозернистые ключи API для пользователей (а не только для клиентов!); тем не менее, полный PITA будет использовать Javascript, даже если это возможно.

Однако с заголовками CORS и небольшим серверным скриптом вы можете напрямую загружать файлы в формы S3 из HTML5; это работает, создавая ссылку для загрузки на стороне сервера; ссылка будет содержать встроенный документ политики, который сообщает, что форма загрузки может быть загружена и с каким видом префикса ( "каталоги" ), типа содержимого и т.д.