svguerin3
svguerin3

Reputation: 2473

Windows Azure - Set Blob Service Properties REST API Call Authentication parameter

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!

Upvotes: 2

Views: 1708

Answers (1)

user94559
user94559

Reputation: 60133

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.

Upvotes: 1

Related Questions