Облачный API с JavaScript (Amazon, Azure) - PullRequest
11 голосов
/ 15 мая 2011

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

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

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

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

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

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

Ответы [ 5 ]

12 голосов
/ 02 марта 2012

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

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

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

3 голосов
/ 15 мая 2011

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

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

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

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

0 голосов
/ 31 июля 2013

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

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

0 голосов
/ 30 июля 2013

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

  1. Вы можете написать простой сервер и предоставить REST API, который аутентифицируется на основе APIKey, передаваемого в качестве параметра запроса, и возвращает ваши конкретные данные обратно клиенту.
  2. Имейте встроенный iframe и сделайте вызов во второй домен из iframe. Получите возвращенный JSON / XML в родительском фрейме и обработайте данные.

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

Вкл. https://developers.google.com/storage/docs/json_api/v1/libraries проверьте секцию Google Cloud Storage JSON API client libraries.

0 голосов
/ 30 июля 2013

Это можно сделать с помощью 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

...