问题 使用JavaScript的Cloud API(亚马逊,Azure)


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

  1. 安全  - 体系结构通常建立在per  客户端基础,因此有一个API密钥(例如)。这是有问题的,因为我需要一个安全性 我的 用户。我无法向所有用户提供相同的API密钥。

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

我的场景涉及来自JS客户端的大量简单队列消息,我想我会使用云来摆脱来自我的主要托管服务提供商的这种流量。 Windows Azure有这个队列服务部分,它似乎非常接近我需要的,除了我不知道这些问题是否可以解决。

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

所以, 是否有一些带有REST API的云存储,它提供客户端身份验证的管理,并且不为它们提供API密钥?


11625
2018-05-15 05:45


起源

为什么你需要直接与云存储通信?为什么这比作为存储接口/网守的云托管网络服务更好呢? - Rup
无论多么假设,这都是表现问题。我觉得这会浪费资源。 - tillda
我正在研究同样的一般话题。 AWS已经推出了IAM,声称“管理对联合用户的访问”,但没有时间完全深入研究它。同样,AWS在实施CORS之前似乎是等待和观望的态度(en.wikipedia.org/wiki/Cross-origin_resource_sharing)这将对这一领域做出巨大贡献。 - Kevin M
@tillda好奇:你为什么要通过JavaScript做所有事情?它是否与成本相关(不想为网络或工作者角色付费 - 尽管它们现在便宜到每小时0.02美元) - 或其他什么? - codingoutloud
云存储应该是针对用户,在他们的帐户下,或者在您的秘密帐户下。就像能够读取js文件的源代码一样,你不能同时拥有保密和客户端代码。 - dandavis


答案:


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

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

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

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


12
2018-03-02 00:02



请记住,JSONP仅限于GETS ...所以它只有1/2个面包。(en.wikipedia.org/wiki/...) - Kevin M
Azure的东西看起来是一个很好的方法,但JSONP在我看来是绝对弃用的技术。 - tillda
@codingoutloud JSONP工作,我们将以任何一种方式需要它。 这个 是Gaurav关于如何使用JavaScript将大型文件直接从客户端浏览器上传到Azure存储的精彩文章。 JS文件绝对需要托管在您上传目标的同一存储帐户上,因为我们无法使用JSONP上传到存储。但我们可以使用JSONP从我们控制的服务器获取SAS。 - astaykov


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

我希望javascript与Web服务交谈,该服务可以检查用户的访问权限并允许/禁止将消息发布到队列。

因此,javascript只会与Web服务通信,并让Web服务处理与队列的通信。

它有点太大了,无法发布示例代码,但希望这足以让您入门。


3
2018-05-15 13:40





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

  1. 您可以编写一个简单的服务器并公开REST apis,它根据作为请求参数传递的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
2017-07-30 14:45





这可以通过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还没有(还)。此外,从你的问题来看,它听起来像排队的解决方案是你想要的亚马逊SQS,但SQS也不支持CORS。

如果您需要任何复杂的队列语义(如消息过期或长轮询),那么S3可能不适合您。但是,如果您的排队要求很简单,那么S3可能是合适的。

您必须从浏览器调用Web服务,并将所需的S3对象URL作为参数。该服务的作用是对请求进行身份验证和授权,如果成功,则生成并返回一个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


0
2017-07-29 22:12





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

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


0
2017-07-30 21:21