我正在尝试对 Set Blob Properties API (http://msdn.microsoft.com/en-us/library/windowsazure/hh452235) 进行简单的 REST 调用,以关闭/打开日志记录。我已获得 REST API 调用以成功检索 Blob 属性,因此我知道我的散列算法、标头设置和身份验证签名创建工作,但我似乎无法让它在设置属性方面工作。我一直在 Authentication Header 上收到错误,所以我知道我没有在那里做某事。
我在下面复制了正在创建的内容并最终散列并放入 auth 标头字符串中。在线文档 (http://msdn.microsoft.com/en-us/library/windowsazure/dd179428) 并不能真正帮助确定这种特定类型的 Blob 请求绝对需要哪些字段,所以我试过了填写其中的大多数,但无论我填写什么,我似乎都没有得到不同的响应。我还尝试了 Shared Key Lite 身份验证,因为它更轻量级,所以它是首选,但这并没有当我填写所有 5 个字段时,似乎也可以工作。
Blob 服务的共享密钥身份验证:
PUT\n
\n
\n
130\n
(MD5_CONTENT_HASH)
\n
\n
\n
\n
\n
\n
\n
x-ms-date:Tue, 19 Jun 2012 19:53:58 GMT\n
x-ms-version:2009-09-19\n
/(MY_ACCOUNT)/\n
comp:properties\n
restype:service
我在这里有什么明显的遗漏吗?当我发出请求调用时,值 (MD5_CONTENT_HASH) 和 (MY_ACCOUNT) 当然会被填写,并且当我发送它时,对“GET”属性的类似请求调用工作正常。那个和这个之间的唯一区别是我发送了 MD5_content 以及内容长度。不过,我可能在这里遗漏了一些明显的东西。
任何建议将不胜感激!提前致谢。-文森特
编辑更多信息:
我正在使用的编程语言:Objective-C (iOS iPhone)
我也在使用 ASIHTTPRequest 来发出请求。我简单地定义了请求,setRequestMethod:@"PUT",然后我创建请求体并将其转换为 NSData 以计算长度。我通过 appendPostData 方法将请求正文数据附加到请求中。然后,我构建上面的身份验证字符串,对整个内容进行哈希处理,并将其作为名为“授权”的标头附加到请求中。
我正在使用的请求正文字符串:
<?xml version=\"1.0\" encoding=\"utf-8\"?><StorageServiceProperties><Logging><Version>1</Version></Logging></StorageServiceProperties>
我知道这是一个不完整的请求正文,但我计划等待它在“缺少请求正文元素”或类似的东西上失败,直到我继续在那里创建完整的 XML。(这可能是我的问题吗?)
我从服务器得到的错误:
<?xml version="1.0" encoding="utf-8"?><Error><Code>AuthenticationFailed</Code><Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
RequestId:accc4fac-2701-409c-b1a7-b3a528ce7e8a
Time:2012-06-20T14:36:50.5313236Z</Message><AuthenticationErrorDetail>The MAC signature found in the HTTP request '(MY_HASH)' is not the same as any computed signature. Server used following string to sign: 'POST
130
x-ms-date:Wed, 20 Jun 2012 14:36:50 GMT
x-ms-version:2009-09-19
/(MY_ACCOUNT)/
comp:properties
restype:service'.</AuthenticationErrorDetail></Error>
奇怪的是,无论我将多少参数传递给身份验证签名,我从服务器返回的错误似乎都是这样。
谢谢你的尽心帮助!