59 lines
No EOL
1.7 KiB
Python
59 lines
No EOL
1.7 KiB
Python
#!/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") |