2
votes

I am trying to make a simple REST call to the Set Blob Properties API (http://msdn.microsoft.com/en-us/library/windowsazure/hh452235) to just turn off/on logging. I have gotten the REST API call to successfully work for retrieving Blob Properties, so I know my hashing algorithms, headers-setting, and Authentication signature creation works, but I can't seem to get it working on the Set Properties side of things. I keep getting an error on the Authentication Header, so I know I'm not doing something right there.

I have copied below what is being created and eventually hashed and put into the auth header string. The online documentation (http://msdn.microsoft.com/en-us/library/windowsazure/dd179428) does not really help in determining which of these fields are absolutely required for this particular type of Blob request, so I've tried filling most of them in, but I don't seem to get a difference response regardless of what I fill in. I've also tried the Shared Key Lite authentication, which would be preferred since it's much more lightweight, but that doesn't seem to work either when I fill in all 5 of those fields.

Shared Key Authentication for Blob Services:

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

Is there anything obvious I'm missing here? The values (MD5_CONTENT_HASH) and (MY_ACCOUNT) are of course filled in when I make the request call, and the similar request call to "GET" the properties works fine when I send it. The only difference between that one and this is that I'm sending the MD5_content, along with the content-length. I may be missing something obvious here, though.

Any advice would be greatly appreciated! Thanks in advance. -Vincent

EDIT MORE INFO:

Programming Language I'm using: Objective-C (iOS iPhone)

I'm also using ASIHTTPRequest to make the request. I simply define the request, setRequestMethod:@"PUT", then I create the request body and convert it to NSData to calculate the length. I attach the request-body data via the appendPostData method to the request. I then build the auth string above, hash the whole thing, and attach it to the request as a header called "Authorization".

Request Body String I'm using:

<?xml version=\"1.0\" encoding=\"utf-8\"?><StorageServiceProperties><Logging><Version>1</Version></Logging></StorageServiceProperties>

I know this is an incomplete request body, but I was planning on waiting for it to give a failure on "missing request body element" or something similar, until I proceeded on creating the full XML there. (could that be my issue?)

Error I get from the server:

<?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>

What's odd is that the error I get back from the server seems to look like that, no matter how many parameters I pass into the Authentication signature.

Thanks for any help you can offer!

1
What programming language are you writing in? Can we see the body of the request? Can you share the actual code? 130 bytes seems too small to fit the required parameters in the XML body. What's the exact error you're getting from the server?user94559
Thanks for the response. I just added details about what I'm sending and getting back. I'm using Objective-C as the language. I know I'm not sending the full request body, but the error I'm getting is related to the Authentication string, so I was waiting until that was resolved before continuing to work on building the request body correctly. Could that be my issue?svguerin3

1 Answers

1
votes

Comparing your signed string and the error message indicates that you're sending a POST request but signing as though you're sending a PUT.