diff --git a/hawk.py b/hawk.py new file mode 100644 index 0000000..584f055 --- /dev/null +++ b/hawk.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python2 +# +# This module lets you create a header for your Hawk authentification. +# +# Usage: +# +# import hawk +# print hawk.mkheader("https://example.com/foo/bar?baz=bum#test", "get", "1234", "5678", "abcdef") +# +# License: This script is public domain. +# Copyright: 2013 Jeena Paradies +# + +import string, random, time, datetime, hmac, hashlib, base64 +from urlparse import urlparse + +def mkheader(url, http_method, hawk_id, key, app_id=None): + + nonce = mknonce(8) + parsed_url = urlparse(url) + + n = datetime.datetime.now() + time_stamp = str(time.mktime(n.timetuple())) + + port = parsed_url.port + if not port: + if parsed_url.scheme == "https": + port = "443" + else: + port = "80" + + fragment = "" + if parsed_url.fragment: + fragment = "#" + parsed_url.fragment + + normalized_string = "hawk.1.header\n"\ + + time_stamp + "\n"\ + + nonce + "\n"\ + + http_method.upper() + "\n"\ + + parsed_url.path + parsed_url.query + fragment + "\n"\ + + parsed_url.hostname.lower() + "\n"\ + + str(port) + "\n"\ + + "\n\n" # we don't use payload yet and we don't use ext + + app = "" + + if app_id: + app = ", app=\"" + app_id + "\"" # we need this later in the header + normalized_string += app_id + "\n\n" # adding app_id to the string and delegate should be empty + + mac = base64.encodestring(hmac.new(key, normalized_string, hashlib.sha256).digest()) + + return 'Hawk id="' + hawk_id + '", mac="' + mac + '", ts="' + time_stamp + '", nonce="' + nonce + '"' + app + +def mknonce(length=6, chars=(string.ascii_uppercase + string.digits)): + return ''.join(random.choice(chars) for x in range(length)) + +if __name__ == "__main__": + print mkheader("https://example.com/foo/bar?baz=bum#test", "get", "1234", "5678", "abcdef") \ No newline at end of file