Создание заголовка авторизации хранилища Azure с использованием python - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь создать заголовок авторизации для использования API REST хранилища Azure. Какой кошмар. Причина, по которой я пытаюсь это сделать, заключается в том, что я пытаюсь использовать конструктор рабочих процессов (Alteryx) для вызова API, поэтому мои единственные программные опции - это Alteryx, python или командная строка.

Я думаю, что я близок, но я просто не понимаю эти последние три строки кода, следуя этой статье - https://docs.microsoft.com/en-us/azure/storage/common/storage-rest-api-auth?toc=%2fazure%2fstorage%2fblobs%2ftoc.json

// Теперь превратим его в байтовый массив. byte [] SignatureBytes = Encoding.UTF8.GetBytes (MessageSignature);

// Создать версию ключа хранения HMACSHA256. HMACSHA256 SHA256 = новый HMACSHA256 (Convert.FromBase64String (storageAccountKey));

// Вычислить хэш SignatureBytes и преобразовать его в строку base64. подпись строки = Convert.ToBase64String (SHA256.ComputeHash (SignatureBytes));

Так что, если я правильно следую этому, я должен создать версию ключа хранения SHA256, но затем я создаю хэш SHA256 хеша подписи SHA256 байтов подписи?

Я в настоящее время гуглюсь и не захожу далеко, но в основном пытаюсь сделать то же самое выше в .net, используя python.

1 Ответ

1 голос
/ 30 мая 2019

В Python вы можете просто использовать эту строку кода:

signed_string = base64.b64encode(hmac.new(base64.b64decode(storage_account_key), msg=string_to_sign.encode('utf-8'), digestmod=hashlib.sha256).digest()).decode()

Вот полный код использования Список BLOB-объектов API :

import requests
import datetime
import hmac
import hashlib
import base64

storage_account_name = 'xx'
storage_account_key = 'xxx'
container_name='aa1'
api_version = '2017-07-29'
request_time = datetime.datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT')

string_params = {
    'verb': 'GET',
    'Content-Encoding': '',
    'Content-Language': '',
    'Content-Length': '',
    'Content-MD5': '',
    'Content-Type': '',
    'Date': '',
    'If-Modified-Since': '',
    'If-Match': '',
    'If-None-Match': '',
    'If-Unmodified-Since': '',
    'Range': '',
    'CanonicalizedHeaders': 'x-ms-date:' + request_time + '\nx-ms-version:' + api_version + '\n',
    'CanonicalizedResource': '/' + storage_account_name +'/'+container_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()

headers = {
    'x-ms-date' : request_time,
    'x-ms-version' : api_version,
    'Authorization' : ('SharedKey ' + storage_account_name + ':' + signed_string)
}

url = ('https://' + storage_account_name + '.blob.core.windows.net/'+container_name+'?restype=container&comp=list')

r = requests.get(url, headers = headers)
print(r.status_code)
print('\n\n'+r.text)

Результат теста:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...