如何通过Flex Application访问Azure blob存储?

时间:2011-01-31 08:02:15

标签: flex4 azure

我正在尝试通过我的flex应用程序访问Azure上的Blob存储。我通过使用Azure Blob Storage提供的URL通过HTTP服务执行此操作。但是,我的存储具有私有和受限访问权限,我只能使用密钥(由Azure提供)更新存储。 由于我的应用程序需要写入此存储,我不知何故需要通过我的HTTPService传递密钥?   有谁知道我怎么能这样做?

此致 阿帕娜

4 个答案:

答案 0 :(得分:0)

Azure存储使用仅由工具包装的REST Api。这是官方的模糊:

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

“获取Blob”的快速参考

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

答案 1 :(得分:0)

因此,第一步是引用 Azure存储REST API ,并根据API规范构建您要用于操作的HTTP请求。

完成后,您将拥有一个标题(授权),您必须为其构建一个字符串。当你没有预制的库时,这是一个棘手的部分。

最终目标是您只需在HTTPService对象中设置并传递Authorization标头。这将包含您的共享密钥以及签名。此密钥是一个长字符串,表示随后由Azure密钥签名的请求。我真的不知道Flex / AS语法,所以我会尽力简单地描述解决方案并且你可以实现。


该签名是您使用密钥签名的字符串。该字符串是以下元素的组合:

  • 请求中使用的HTTP方法/动词
  • Content-MD5标头值
  • Content-type标头值
  • 日期
  • 所有azure特定(“x-ms- *”)标题
  • 的串联字符串
  • Azure帐户名的串联字符串+您正在访问的Blob路径

所以你要收集/创建所有这些,连接所有这些字符串,使用你的密钥创建该字符串的签名,在

中传递

重要的是要注意,由于您在一个请求中发送了所有这些内容,因此这些标头的值只是基于您传入的内容。因此,您不会选择可选字段(如Content-MD5)必须使用这可能是空白的,你只需要传递它们。签名仅基于您发送的内容,没有双因素检查。

第1步:收集数据,只将每个数据存储在变量中,或者在构建要签名的字符串时动态构建。

HTTP方法 - 无论您尝试使用Azure做什么。如果阅读,请使用GEt。如果正在创建,请使用POST。如果修改,请使用PUT。等......这恰好与你正在做的事情相匹配

Content-MD5 - 如上所述,我们不必在这里构建摘要,只需使用换行符(C#中的“\ n”)

Content-Type - HTTPService对象具有此字段。根据您使用API​​执行的操作进行设置,然后再次参考签名。

日期 - 再次,这是可选的,因为Azure请求会传递日期的自定义标头。只需再次添加换行符即可。如果你想传递一个日期,那很好,只要确保你在这里引用相同的值

标题 - 这是一种特定的语言,所以我只是描述一下。您需要构建您的请求对象(基于Azure API)然后访问请求的标头数组,遍历每个,找到以“x-ms-”开头的那些并构建它们的长字符串。你还需要处理重复(不通过)和空白。

所以,如果我的请求中有5个标题:

  • ContentType:text / xml
  • eTag:10101010
  • x-ms-version:2009-09-19
  • x-ms-metadata:SomeData

我的标题字符串为Headers[x-ms-version] + Headers[x-ms-metadata]

“2009-09-19SomeData”

资源 - 这只是您正在访问的Azure Storage Account Name + the request Uri

第2步:构建要签名的字符串 所以你拥有所有这些,构造一个包含所有这些变量的字符串:

string strToSign = HttpMethoid + Content-MD5 +
   Content-Type + Date + HeadersStr + ResourceStr

第3步:使用存储密钥对字符串进行签名

使用您的存储帐户密钥构造此字符串的HMAC-SHA256哈希。 您可能需要为Flex下载扩展库。我不认为它默认包含加密。只需谷歌HMAC-SHA256 Flex并使用其中一个

第4步:构建授权标头 获得该哈希后,您将完成所有操作并构建授权标头。格式为

authString = "SharedKey" + [AzureAccountName] + [Signed String you just created]

将此添加到请求中,例如

req.Headers.Add("Authorization", authString);

如果您已完成所有这些操作,则该请求将起作用。如果没有,你会得到403.一旦你做对了,把它存放在一个图书馆,b / c相信我你不想重建:)

祝你好运

答案 2 :(得分:0)

您需要在HTTP标头中传递密钥。您可以查看此材料,其中介绍了如何通过REST API与Azure存储通信,包括更新标头值:http://msdn.microsoft.com/en-us/library/dd179428.aspx

如果对某些.NET代码示例感兴趣,请在Windows Azure SDK附带的Microsoft.WindowsAzure.StorageClient程序集上使用Reflector,以了解它们是如何进行的。

答案 3 :(得分:0)

我不确定Flex是否支持Java,但如果它支持Java,那么您可以使用Windows Azure SDK for Java而不是编写自己的ActionScript包装器来实现Azure REST API。有关这方面的更多信息,请访问:http://www.windowsazure4j.org/