Проблемы с подключением к Azure-Datalakes-gen2 с использованием модуля запросов в Python - PullRequest
1 голос
/ 15 мая 2019

В настоящее время я пытаюсь подключиться к azure datalakes-gen2, используя python для получения информации из файлов json, хранящихся внутри. Услышав, что модуль azure-datalakes для python не работает для gen 2 (и у меня возникли проблемы), я перешел к подключению через rest-api и пакет запросов, найденный в python. Однако чтение ссылок, оставленных Microsoft вместе с требуемым заголовком аутентификации, еще больше запутало меня в том, что делать.

Хотя у меня есть общее представление о Python, я все еще любитель, когда дело доходит до более продвинутых проектов, и мне всегда нужно искать вещи, однако я впервые задаю вопрос о помощи, а не ищу, пока не найду ответ (так что, пожалуйста, потерпите меня).

Я нашел полезную ссылку от Michal Pawlikowski, объясняющую, как подключиться через powershell, и это помогло объяснить множество слабых сторон, но все еще оставалось с двумя проблемами, во-первых, я не уверен в правильном кодировании заголовка аутентификации. в частности, «закодируйте эту строку с помощью алгоритма HMAC-SHA256 над строкой подписи в кодировке UTF-8», а во-вторых, в ней будут перечислены только файлы, найденные внутри каталога, а не информация, содержащаяся внутри файлов.

Вот что я пытался


date = "Wed, 15 May 2019 14:28:01 GMT"

string_to_sign = 'GET\n\n\n\n\n\n\n\n\n\n\n\nx-ms-date:'+date+'\nx-ms-version:2018-11-09\n/'+STORAGE_ACCOUNT_NAME+'/'+FILE_SYSTEM_NAME+'\nrecursive:true\nresource:fileststem'

signature = #Encoded string_to_sign + key, am unsure how to approach

auth_header = "SharedKey "+STORAGE_ACCOUNT_NAME+":"+signature

headers = {"Authorization" : auth_header, "x-ms-version" : "2018-11-09", "x-ms-date" : date}


req = requests.get("https://"+STORAGE_ACCOUNT_NAME+".dfs.core.windows.net/" + FILE_SYSTEM_NAME + "?recursive=true&resource=filesystem", headers=headers)

Я ожидаю, что req.text будет содержать информацию, найденную в файле json, однако я всегда получу сообщение об ошибке 403, подтверждающее, что мои заголовки отформатированы правильно.

1 Ответ

0 голосов
/ 16 мая 2019

Если вы хотите прочитать содержимое файла, вы должны использовать Read api .

Код ниже работает на моей стороне:

import requests
import datetime
import hmac
import hashlib
import base64

storage_account_name = 'storage_account_name'
storage_account_key = 'storage_account_key'
api_version = '2018-11-09'
request_time = datetime.datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT')

#the file path on adls gen2
FILE_SYSTEM_NAME='dd1/11.txt'

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,
    'CanonicalizedResource': '/' + storage_account_name+'/'+FILE_SYSTEM_NAME
    }

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']+'\n'
                  + 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 + '.dfs.core.windows.net/'+FILE_SYSTEM_NAME)
r = requests.get(url, headers = headers)

#print out the file content
print(r.text)

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

enter image description here

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