Python Embracing Windows Azure
Monday November 17, 2008
Sriram Krishnan, a Microsoft Program Manager, recently posted on using Python to access Azure's storage service. Azure, you may recall, is Microsoft's latest try to break into cloud computing. In a recent entry on his blog, Krishnan features a Python wrapper that shows how to automate your session's authentication with Azure. First, you make the connection:
Kudos to Abel Avram for his discussion on this.
conn = WAStorageConnection(DEVSTORE_HOST, DEVSTORE_ACCOUNT, DEVSTORE_SECRET_KEY)
for (container_name,etag, last_modified ) in conn.list_containers():
print container_name
print etag
print last_modified
conn.create_container("testcontainer", False)
conn.put_blob("testcontainer","test","Hello World!" )
print conn.get_blob("testcontainer", "test")
Then you get the security headers:
def _get_auth_header(self, http_method, path, data, headers):
# As documented at http://msdn.microsoft.com/en-us/library/dd179428.aspx
string_to_sign =""
#First element is the method
string_to_sign += http_method + NEW_LINE
#Second is the optional content MD5
string_to_sign += NEW_LINE
#content type - this should have been initialized atleast to a blank value
if headers.has_key("content-type"):
string_to_sign += headers["content-type"]
string_to_sign += NEW_LINE
# date - we don't need to add header here since the special date storage header
# always exists in our implementation
string_to_sign += NEW_LINE
# Construct canonicalized storage headers.
# TODO: Note that this doesn't implement parts of the spec - combining header fields with same name,
# unfolding long lines and trimming white spaces around the colon
ms_headers =[header_key for header_key in headers.keys() if header_key.startswith(PREFIX_STORAGE_HEADER)]
ms_headers.sort()
for header_key in ms_headers:
string_to_sign += "%s:%s%s" % (header_key, headers[header_key], NEW_LINE)
# Add canonicalized resource
string_to_sign += "/" + self.account_name + path
utf8_string_to_sign = unicode(string_to_sign).encode("utf-8")
hmac_digest = hmac.new(self.secret_key, utf8_string_to_sign, hashlib.sha256).digest()
return base64.encodestring(hmac_digest).strip()
As noted by Krishnan, this is his draft code and not production quality. You can get updates at his GitHub spot.
Kudos to Abel Avram for his discussion on this.

Comments
No comments yet. Leave a Comment