не удается подключиться к API REST файловой службы Azure с помощью python

Я хочу получить доступ к своей файловой службе с помощью запроса python, руководствуясь страница списка общих ресурсов, я новичок в REST и python Request. мой вклад

headers= {'x-ms-date': '2018-04-17 06:22:15.181620', 'Authorization': 'SharedKey zedongstorageaccount:codecodecodeFiTzubX9tvC3G3PcDYzR2cX/TMjkOu4JhsvQffS+xTDDBQ==', 'x-ms-version': '2017-07-29'}
url = 'https://zedongstorageaccount.file.core.windows.net/?comp=list'
r=requests.get(url,headers=headers)

Но получаю ошибку, вывод r.content:

b'\xef\xbb\xbf<?xml version="1.0" encoding="utf-8"?><Error><Code>AuthenticationFailed</Code><Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.\nRequestId:ef98f282-f01a-0042-3e24-d62397000000\nTime:2018-04-17T08:16:21.9635335Z</Message><AuthenticationErrorDetail>The Date header in the request is incorrect.</AuthenticationErrorDetail></Error>'

Я также пробовал заголовок {'x-ms-date': '2018-04-17 06:22:15.181620', 'Authorization': 'SharedKey zedongnewstorageaccount:NJYYtabOIj5D1R+xb0PpmXrjCldf6NA6oLkYReAKFiTzubX9tvC3G3PcDYzR2cX/TMjkOu4JhsvQffS+xTDDBQ==', 'x-ms-version': '2017-07-29'}, потому что я не знаю, находятся ли Authorization и account в одной строке. Еще пробовал много версий x-ms-version. Но там отвечают все 400 или 403.

Я прочитал Проверка подлинности для службы хранилища Azure, но запутались.

Где ошибка? И есть ли случай, когда я могу научиться создавать свое приложение с помощью Azure REST API? (Я использую ключевое слово для Google, все страницы посвящены созданию REST API и официальной документации Azure)


person 张泽栋    schedule 17.04.2018    source источник
comment
Вы используете ключ учетной записи в заголовке Authorization?   -  person Gaurav Mantri    schedule 17.04.2018
comment
да, ключ хранения учетной записи. Это неправильно? Что мне использовать?   -  person 张泽栋    schedule 17.04.2018
comment
Да, это неверно. На самом деле вам нужно будет вычислить шаги заголовка авторизации, которые описаны здесь: docs.microsoft.com/en-us/rest/api/storageservices/. Мне просто любопытно, почему вы не используете Python SDK для службы хранилища Azure вместо прямого использования REST API?   -  person Gaurav Mantri    schedule 17.04.2018
comment
Гаурав прав, почему бы не использовать Python SDK вместо прямого вызова REST API? github.com/Azure/azure-storage-python   -  person Zhaoxing Lu    schedule 17.04.2018
comment
Я думал, что REST по ошибке проще Python SDK. Выслушав ваши слова, я сейчас попробую Python SDK.   -  person 张泽栋    schedule 17.04.2018
comment
И в любом случае я могу научиться создавать свое приложение с помощью Python SDK? Я новичок в этом.   -  person 张泽栋    schedule 17.04.2018
comment
@ 张泽栋 у вас есть образцы, которые доступны в репозитории GitHub SDK Python для службы хранилища Azure github.com/Azure/azure-storage-python/tree/master/samples/file   -  person Ivan Ignatiev    schedule 17.04.2018


Ответы (1)


Я также рекомендую использовать Python SDK, но в образовательных целях:

import requests
import datetime
import hmac
import hashlib
import base64

storage_account_name = 'teststorageaccount'
storage_account_key = 'D4x6YChpyfqWk9a.......'
api_version = '2016-05-31'
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 + '/\ncomp:list'
}

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 + '.file.core.windows.net/?comp=list')

r = requests.get(url, headers = headers)

print(r.content)

Выход:

<?xml version="1.0" encoding="utf-8"?><EnumerationResults ServiceEndpoint="https://teststorageaccount.file.core.windows.net/"><Shares><Share><Name>myfileshare</Name><Properties><Last-Modified>Tue, 17 Apr 2018 13:43:00 GMT</Last-Modified><Etag>"0x8D5A46922CA8BDA"</Etag><Quota>10</Quota></Properties></Share></Shares><NextMarker /></EnumerationResults>
person Ivan Ignatiev    schedule 17.04.2018
comment
Я рекомендую вам повторно создать ключ учетной записи, если это настоящий ключ. - person Tom Sun - MSFT; 20.04.2018
comment
@TomSun Я регенерировал ключ и с самого начала поставил поддельное имя учетной записи хранения, это было для лучшей демонстрации, но спасибо за заботу! - person Ivan Ignatiev; 20.04.2018