【问题标题】:Cloud API with JavaScript (Amazon, Azure)带有 JavaScript 的云 API(亚马逊、Azure)
【发布时间】:2011-08-25 18:59:06
【问题描述】:

我正在研究直接从客户端 JavaScript 使用某些云存储的可能性。但是,我遇到了两个问题:

  1. 安全性 - 架构通常基于每个 cloud 客户端构建,因此只有一个 API 密钥(例如)。这是有问题的,因为我需要每个 my 用户的安全性。我无法为所有用户提供相同的 API 密钥。

  2. 跨域 AJAX。 浏览器可以使用 HTTP 标头来执行跨域请求,但这意味着我必须能够在云边。但是,我唯一需要做的就是能够添加自定义 HTTP 响应标头:Access-Control-Allow-Origin: otherdomain.com

我的场景涉及大量来自 JS 客户端的简单队列消息,我想我会使用云来摆脱来自主要托管服务提供商的这些流量。 Windows Azure 有这个 Queue Service 部分,看起来和我需要的很接近,只是不知道这些问题能不能解决。

有什么想法吗?在我看来,云服务的 JavaScript 客户端在不久的将来是不可避免的场景。

那么,是否有一些带有 REST API 的云存储提供对客户端身份验证的管理并且不向他们提供 API 密钥?

【问题讨论】:

  • 为什么需要直接与云存储通信 - 为什么这比与充当存储接口/看门人的云托管 Web 服务通信更好?
  • 这是一个性能问题,尽管是假设性的。我只是觉得这会浪费资源。
  • 正在研究相同的一般主题。 AWS 引入了 IAM,声称“管理联合用户的访问”,但还没有时间完全深入研究。同样,AWS 在实施 CORS (en.wikipedia.org/wiki/Cross-origin_resource_sharing) 之前似乎持观望态度,这将极大地促进这一领域。
  • @tillda 好奇:你为什么要尝试通过 JavaScript 做所有事情?是否与成本相关(不想为网络或工作者角色付费——尽管它们现在的价格仅为 0.02 美元/小时)——还是其他原因?
  • 云存储应该是给用户的,在他们的账户下,或者给你,在你的秘密账户下。就像能够读取 js 文件的源代码一样,您不能同时拥有保密代码和仅客户端代码。

标签: javascript api azure amazon-web-services cloud


【解决方案1】:

Windows Azure Blob 存储具有Shared Access Signature (SAS) 的概念,它可以在服务器端发出,本质上是一个特殊的 URL,客户端可以写入而无需直接访问存储帐户 API 密钥。这是 Windows Azure 存储中唯一允许在不访问存储帐户密钥的情况下写入数据的机制。

SAS 可能会过期(例如,给用户 10 分钟的时间来使用 SAS URL 进行上传),并且可以设置为允许在发布后取消访问。此外,SAS 可用于有时间限制的读取访问(例如,给用户 1 天的时间观看此视频)。

如果您的 JavaScript 客户端也在浏览器中运行,您可能确实存在跨域问题。我有两个想法 - 都没有经过测试!一种想法是JSONP 风格的方法(尽管这将仅限于 HTTP GET 调用)。另一个(更有希望)的想法是将 .js 文件与您的数据文件一起托管在 blob 存储中,这样它们就在同一个域中(希望让您的网络浏览器满意)。

“真正的”解决方案可能是跨域资源共享 (CORS) 支持,但这在 Windows Azure Blob 存储中不可用,并且仍在浏览器中出现(以及其他 HTML 5 优点)。

【讨论】:

  • 请记住,JSONP 仅限于GETS ...所以它只有1/2 个面包。(en.wikipedia.org/wiki/…)
  • Azure 的东西看起来是个好方法,但在我看来 JSONP 是绝对不推荐使用的技术。
  • @codingoutloud JSONP 有效,无论哪种方式我们都需要它。 This 是 Gaurav 撰写的一篇很棒的文章,介绍了如何使用 JavaScript 将大文件直接从客户端浏览器上传到 Azure 存储。 JS 文件绝对需要托管在您以上传为目标的同一存储帐户上,因为我们不能使用 JSONP 上传到存储。但是我们可以使用 JSONP 从我们控制的 Server 中获取 SAS。
【解决方案2】:

是的,您可以这样做,但您不希望您的 azure 密钥在客户端可用,以便 javascript 能够直接访问队列。

我会让 javascript 与 Web 服务对话,该服务可以检查用户的访问权限并允许/禁止向队列发布消息。

因此,javascript 只会与 Web 服务对话,而让 Web 服务处理与队列的对话。

发布示例代码的主题有点过大,但希望这足以让您入门。

【讨论】:

    【解决方案3】:

    我认为现有的服务提供商不允许您直接从客户端查询存储。所以为了解决问题:

    1. 您可以编写一个简单的服务器并公开 REST API,这些 API 基于作为请求参数传递的 APIKey 进行身份验证,并将您的特定数据返回给您的客户端。
    2. 有一个嵌入式 iframe 并从 iframe 调用第二个域。在父框架上获取返回的 JSON/XML 并处理数据。

    更新: 看起来谷歌已经解决了你的问题。签出this

    https://developers.google.com/storage/docs/json_api/v1/libraries 上查看Google Cloud Storage JSON API client libraries 部分。

    【讨论】:

      【解决方案4】:

      这可以通过 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 可能是合适的。

      您必须使用所需的 S3 对象 URL 作为参数从浏览器调用 Web 服务。该服务的作用是对请求进行身份验证和授权,如果成功,则生成并返回一个 URL,该 URL 使用查询字符串身份验证提供对 S3 对象的临时访问权限。

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

      一种巧妙的方法可能是让服务重定向到查询字符串身份验证 URL。

      对于那些想知道为什么这是一件好事的人,这意味着您不必通过计算层流式传输所有 S3 对象内容。您只需生成一个查询字符串经过身份验证的 URL(本质上只是一个签名字符串),这是一个非常便宜的操作,然后依靠 S3 提供的大规模可扩展性来进行实际的上传/下载。

      更新:截至今年 11 月,Azure 现在支持表、队列和 Blob 存储上的 CORS

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

      【讨论】:

        【解决方案5】:

        使用 Amazon S3 和 Amazon IAM,您可以为用户(不仅仅是客户端!)生成非常精细的 API 密钥;但是,即使可能,完整的 PITA 也可以从 Javascript 中使用。

        但是,使用 CORS 标头和少量服务器脚本,您可以从 HTML5 表单直接上传到 S3;这通过在服务器端生成上传链接来工作;该链接将包含一个嵌入的策略文档,说明允许上传的上传表单以及使用哪种前缀(“目录”)、内容类型等。

        【讨论】:

          猜你喜欢
          • 2022-12-03
          • 2012-11-29
          • 2016-11-26
          • 1970-01-01
          • 1970-01-01
          • 2015-10-30
          • 1970-01-01
          • 1970-01-01
          • 2015-02-19
          相关资源
          最近更新 更多