Как вывести список всех больших двоичных объектов с помощью токена SAS учетной записи хранения Azure?

Используя Python azure-storage API, я ожидаю, что смогу сгенерировать токен SAS учетной записи, который позволит мне читать и записывать большие двоичные объекты в любом контейнере в моей учетной записи хранения.

Создание токена SAS происходит без исключения, но когда я пытаюсь создать BlockBlobService с помощью этого токена SAS и перечислить несколько больших двоичных объектов для данного контейнера, я получаю AuthorizationPermissionMismatch ошибку от Azure.

Правильно ли я понимаю концепцию токена SAS учетной записи?

Я просмотрел тонну документации по Azure "Приступая к работе" для API хранилища Python, а также просмотрел https://azure-storage.readthedocs.io/ref/azure.storage.blob.sharedaccesssignature.html совсем немного.

Я пробовал использовать azure.storage.blob.BlockBlobService.generate_account_shared_access_signature() с очень разрешительными разрешениями, но все еще получаю исключение.

Я могу подтвердить, что azure.storage.blob.BlockBlobService.generate_container_shared_access_signature() работает нормально, однако мое требование - создать токен SAS независимо от контейнера.

from azure.storage.blob import BlockBlobService
from azure.storage.models import AccountPermissions, ResourceTypes

bbs = BlockBlobService("myaccountname", "myaccountkey")

sas_token = bbs.generate_account_shared_access_signature(
                    ResourceTypes.CONTAINER + ResourceTypes.OBJECT + ResourceTypes.SERVICE,
                    AccountPermissions.READ + AccountPermissions.WRITE + AccountPermissions.LIST + AccountPermissions.CREATE,
                    datetime.utcnow() + timedelta(hours=1)
                    )

BlockBlobService(account_name="myaccountname", sas_token=sas_token).list_blobs("containername")
azure.common.AzureHttpError: This request is not authorized to perform this operation using this permission.
<?xml version="1.0" encoding="utf-8"?><Error><Code>AuthorizationPermissionMismatch</Code><Message>This request is not authorized to perform this operation using this permission.
RequestId:6a06b32e-f01e-005a-44e7-430c8b000000
Time:2019-07-26T19:22:02.7337249Z</Message></Error>

Я ожидал, что смогу позвонить здесь list_blobs() без проблем. Как я могу сделать это, не создавая контейнер SAS Token по контейнеру?


person Austin T    schedule 26.07.2019    source источник
comment
Можете ли вы поделиться токеном SAS, сгенерированным вашим кодом?   -  person Gaurav Mantri    schedule 26.07.2019
comment
У вашего токена SAS есть только разрешение на создание (sp = c). Можете ли вы попробовать создать токен SAS только с разрешением на список?   -  person Gaurav Mantri    schedule 27.07.2019
comment
Гаурав, ты что-то понял. Простое использование разрешения списка позволяет мне перечислить капли в контейнере. Это хорошее начало - теперь я должен понять, как составлять списки, читать, писать и творить!   -  person Austin T    schedule 27.07.2019
comment
Фантастика! Я бы порекомендовал изучить исходный код SDK, чтобы понять, почему разрешения не установлены должным образом. Мне нравится ваш код.   -  person Gaurav Mantri    schedule 27.07.2019
comment
Я согласен - в исходном коде SDK может что-то происходить. Ничто в документации не говорит мне, что я не могу иметь несколько разрешений для нескольких типов служб. docs.microsoft.com/en-us/ отдых / api / storageservices /   -  person Austin T    schedule 27.07.2019
comment
Жду отзывов от команды Azure по проблеме, которую я открыл по этому поводу: github .com / Azure / azure-storage-python / issues / 621.   -  person Austin T    schedule 28.07.2019


Ответы (1)


Я просмотрел определения функции _ 1_ и его параметры _ 2_ & _ 3_, как показано на рисунках ниже.

Рис 1. Определения функции generate_account_shared_access_signature

введите здесь описание изображения

Рис 2. Определения класса ResourceTypes

введите здесь описание изображения

Рис 3. Определения класса AccountPermission

введите здесь описание изображения

Согласно этим определениям, приведенным выше, я думаю, что ваша проблема была вызвана использованием синтаксиса + для комбинирования этих типов ресурсов и разрешений по вашему желанию.

Вот мой пример кода, который отлично работает без такой проблемы, как ваша.

from azure.storage.blob import BlockBlobService
from azure.storage.models import AccountPermissions, ResourceTypes
from datetime import datetime, timedelta

account_name = '<your account name>'
account_key = '<your account key>'

bbs = BlockBlobService(account_name, account_key)

resource_types = ResourceTypes(service=True, container=True, object=True)
permission = AccountPermissions(read=True, write=True, delete=False, list=True, add=False, create=True, update=False, process=False, _str=None)
sas_token = bbs.generate_account_shared_access_signature(resource_types=resource_types, permission=permission, expiry=datetime.utcnow() + timedelta(hours=1))
blobs = BlockBlobService(account_name=account_name, sas_token=sas_token).list_blobs("<your container name>")
print(list(blobs))

Надеюсь, это поможет.

person Peter Pan    schedule 29.07.2019
comment
Спасибо, Питер, я попробую этот метод - пока что это был пример «Начало работы» из Azure (строки 200–203), который у меня не работал github.com/Azure-Samples/storage-blob-python-getting-started/ - person Austin T; 30.07.2019