Подпись MAC пакета SDK Python для хранилища BLOB-объектов Azure

Я генерирую sas и могу получить доступ к файлу, но когда я передаю URL-адрес blob-клиенту в upload_file_url, он вызывает исключение

try:
#getting container client
blob_container_client = BlobServiceClient(account_url,account_key).get_container_client(container=container_name)

#generate sas tocket for block container
sas=(BlobSharedAccessSignature(account_name, account_key).\
    generate_container(container_name,permission='r',start='2021-03-01T00:00Z',expiry='2021-04-01T00:00Z'))

#generate final url with sas
final_source_url=(blob_container_client.url+'/'+sourcefile+'?'+sas)
print(final_source_url)

blob_client1=blob_container_client.get_blob_client(sourcefile)
source=blob_client1.download_blob().readall()

#---------ACCOUNT 2---------------------
# getting container client for second account
blob_client2 = BlobServiceClient(account_url2, account_key2).get_blob_client(container=container_name2,blob=destinationfile2)
blob_client2.upload_blob_from_url(final_source_url)

кроме Exception as ex: print ('Exception:') print (ex)

Exception:
Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
RequestId:527a4df5-501e-003e-03d6-0f4d5b000000
Time:2021-03-03T02:41:38.6605824Z
ErrorCode:AuthenticationFailed
Error:None
AuthenticationErrorDetail:The MAC signature found in the HTTP request 'xxxxxxxxxxxxxxxxxxxxxxxxxxx=' is not the same as any computed signature. Server used following string to sign: 'PUT

x-ms-client-request-id:f9918e5a-7bc9-11eb-86ab-803049852acd
x-ms-copy-source:://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
x-ms-date:Wed, 03 Mar 2021 02:41:37 GMT
x-ms-version:2020-06-12
/xxxxx/xxxxxxx/testt.txt'.

SAS предназначен для чтения из account1, а затем для загрузки файла account2 с помощью sas. Я хочу скопировать файл из учетной записи 1 в учетную запись 2.

исключение в этой строке: blob_client2.start_copy_from_url ('final_source_url')


person Oleksiy Mumzhu    schedule 03.03.2021    source источник
comment
См .: stackoverflow .com / questions / 58164698 /   -  person Soccerjoshj07    schedule 25.05.2021


Ответы (1)


Проблема заключается в разрешениях в вашей подписи общего доступа. Вы создаете подпись общего доступа только с read (r) разрешением (что подходит для чтения большого двоичного объекта), однако вы пытаетесь выполнить операцию записи с этой подписью общего доступа (операция копирования - это операция записи).

sas=(BlobSharedAccessSignature(account_name, account_key).\
    generate_container(container_name,permission='r',start='2021-03-01T00:00Z',expiry='2021-04-01T00:00Z'))

Измените свою подпись, включив write (w) разрешение, и вы не должны получать эту ошибку. Примерно так:

sas=(BlobSharedAccessSignature(account_name, account_key).\
    generate_container(container_name,permission='rw',start='2021-03-01T00:00Z',expiry='2021-04-01T00:00Z'))
person Gaurav Mantri    schedule 03.03.2021
comment
SAS предназначен для чтения из account1, а затем для загрузки файла account2 с помощью sas. Я хочу скопировать файл из учетной записи 1 в учетную запись 2. - person Oleksiy Mumzhu; 03.03.2021
comment
В какой строке вашего кода возникает исключение? - person Gaurav Mantri; 03.03.2021
comment
Кроме того, не могли бы вы поделиться полным кодом? Вы упомянули upload_file_url в своем вопросе, но я не смог найти его в фрагменте кода, которым вы поделились. Единственное, что я вижу, это start_copy_from_url. - person Gaurav Mantri; 03.03.2021
comment
в этой строке: blob_client2.start_copy_from_url (final_source_url) - person Oleksiy Mumzhu; 03.03.2021
comment
Я пробую метод: upload_blob_from_url и его то же исключение - person Oleksiy Mumzhu; 03.03.2021
comment
это весь код, который у меня есть ( - person Oleksiy Mumzhu; 03.03.2021
comment
Это довольно странно. Дай мне проверить. - person Gaurav Mantri; 03.03.2021
comment
Спасибо, много ищу и таких случаев нет. Я думаю, что ошибка проще или страннее, потому что я ничего не могу найти. - person Oleksiy Mumzhu; 03.03.2021
comment
Я попробовал самостоятельно и смог успешно использовать ваш код. Вот мой код: gist.github.com/gmantri/71118989dc6c344701ba160787137. HTH. - person Gaurav Mantri; 03.03.2021
comment
Спасибо за помощь! Вы используете свои ключи в коде или переменной sys? - person Oleksiy Mumzhu; 03.03.2021
comment
Я использую ключи. - person Gaurav Mantri; 04.03.2021