我正在研究直接从客户端JavaScript使用一些云存储的可能性。但是,我遇到了两个问题:
安全 - 体系结构通常建立在per 云 客户端基础,因此有一个API密钥(例如)。这是有问题的,因为我需要一个安全性 我的 用户。我无法向所有用户提供相同的API密钥。
跨域AJAX。 浏览器可以使用HTTP标头来执行跨域请求,但这意味着我必须能够在云端设置它们。但是,我唯一需要做的就是 能够添加自定义HTTP响应标头:Access-Control-Allow-Origin:otherdomain.com。
我的场景涉及来自JS客户端的大量简单队列消息,我想我会使用云来摆脱来自我的主要托管服务提供商的这种流量。 Windows Azure有这个队列服务部分,它似乎非常接近我需要的,除了我不知道这些问题是否可以解决。
有什么想法吗?在我看来,云服务的JavaScript客户端在不久的将来是不可避免的场景。
所以, 是否有一些带有REST API的云存储,它提供客户端身份验证的管理,并且不为它们提供API密钥?
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优点)。
是的,你可以这样做但你不希望客户端提供你的azure密钥,以便javascript能够直接访问队列。
我希望javascript与Web服务交谈,该服务可以检查用户的访问权限并允许/禁止将消息发布到队列。
因此,javascript只会与Web服务通信,并让Web服务处理与队列的通信。
它有点太大了,无法发布示例代码,但希望这足以让您入门。
我认为现有的服务提供商不允许您直接从客户端查询存储。所以为了解决这个问题:
- 您可以编写一个简单的服务器并公开REST apis,它根据作为请求参数传递的APIKey进行身份验证,并将您的特定数据返回给您的客户端。
- 有一个嵌入式iframe,并从iframe调用第二个域。获取父帧上返回的JSON / XML并处理数据。
更新:
看起来Google已经解决了您的问题。检查 这个 出。
上 https://developers.google.com/storage/docs/json_api/v1/libraries 检查 Google Cloud Storage JSON API client libraries
部分。
这可以通过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
使用Amazon S3和Amazon IAM,您可以为用户生成非常精细的API密钥(不仅仅是客户端!);但是,即使可能,也可以从Javascript中使用PITA。
但是,使用CORS标头和很少的服务器脚本,您可以从HTML5表单直接上传到S3;这可以通过在服务器端生成上传链接来实现;该链接将有一个嵌入式策略文档,它告诉上载表单允许上传的内容以及使用哪种前缀(“目录”),内容类型等等。