scripts/test-hmac-auth.py (38 lines of code) (raw):
#!/usr/bin/python
import requests
import hashlib
import copy
import hmac
from email.utils import formatdate
import base64
import urllib
import sys
import logging
import shutil
logging.basicConfig(level=logging.DEBUG)
def sign_request(original_headers, method, path, content_body, shared_secret):
"""
returns a dictionary including a suitable authorization header
:param original_headers: original content headers
:param content_body: data that is being sent
:return: new headers dictionary
"""
new_headers = copy.deepcopy(original_headers)
content_hasher = hashlib.sha384()
content_hasher.update(content_body)
nowdate = formatdate(usegmt=True)
new_headers['X-Sha384-Checksum'] = base64.b64encode(content_hasher.digest())
new_headers['Content-Length'] = str(len(content_body))
new_headers['Date'] = nowdate
string_to_sign = """{date}\n{contentlength}\n{checksum}\n{method}\n{path}""".format(
date=nowdate,contentlength=new_headers['Content-Length'],checksum=new_headers['X-Sha384-Checksum'],
method=method,path=path
)
print "debug: string to sign: {0}".format(string_to_sign)
hmaccer = hmac.new(shared_secret, string_to_sign, hashlib.sha384)
result = base64.b64encode(hmaccer.digest())
print "debug: final digest is {0}".format(result)
new_headers['X-Hmac-Authorization'] = "testscript:{0}".format(result)
return new_headers
#START MAIN
shared_secret = "rubbish"
target_url = urllib.quote(sys.argv[1],'')
print "Encoded target url is {0}".format(target_url)
signed_headers = sign_request({}, "GET", "/stream/{0}".format(target_url), "", shared_secret)
result = requests.get("http://localhost:9000/stream/{0}".format(target_url), headers=signed_headers, stream=True)
print "Server returned {0}: {1}".format(result.status_code, result.headers)
print "Outputting returned data to outfile.dat"
with open("outfile.dat", "wb") as f:
shutil.copyfileobj(result.raw, f)
#print result.text