I need to use REST to upload a file to Azure blob storage, but I also must use python. I can't seem to work out the Authorization header though.
The code below will show what I am currently trying
import requests
import datetime
import hmac
import hashlib
import base64
url = 'https://mypoc.blob.core.windows.net/mycontainer/testpdf'
blob_name = 'testpdf'
blob_type = 'BlockBlob'
storage_account_name = 'mypoc'
storage_account_key = 'thisisakey'
container_name='mycontainer'
api_version = '2018-03-28'
request_time = datetime.datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT')
string_params = {
'verb': 'PUT',
'Content-Encoding': '',
'Content-Language': '',
'Content-Length': '0',
'Content-MD5': '',
'Content-Type': '',
'Date': '',
'If-Modified-Since': '',
'If-Match': '',
'If-None-Match': '',
'If-Unmodified-Since': '',
'Range': '',
'CanonicalizedHeaders': 'x-ms-blob-type:' + blob_type + '\nx-ms-date:' + request_time + '\nx-ms-version:' + api_version,
'CanonicalizedResource': '/' + storage_account_name +'/'+container_name + '/' + blob_name
#'\ncomp:list\nrestype:container'
}
string_to_sign = (string_params['verb'] + '\n'
+ string_params['Content-Encoding'] + '\n'
+ string_params['Content-Language'] + '\n'
+ string_params['Content-Length'] + '\n'
+ string_params['Content-MD5'] + '\n'
+ string_params['Content-Type'] + '\n'
+ string_params['Date'] + '\n'
+ string_params['If-Modified-Since'] + '\n'
+ string_params['If-Match'] + '\n'
+ string_params['If-None-Match'] + '\n'
+ string_params['If-Unmodified-Since'] + '\n'
+ string_params['Range'] + '\n'
+ string_params['CanonicalizedHeaders']
+ string_params['CanonicalizedResource'])
signed_string = base64.b64encode(hmac.new(base64.b64decode(storage_account_key), msg=string_to_sign.encode('utf-8'), digestmod=hashlib.sha256).digest()).decode()
Authorization = 'SharedKey ' + storage_account_name + ':' + signed_string
print(Authorization)
This generates a key but when I try to hit the API it says the Authorization header is formed incorectly
Content-Length
request header. Also there's a missing new line character afterCanonicalizedHeaders
. – Gaurav Mantri