如何使用Azure存储帐户SAS令牌列出所有Blob?

时间:2019-07-26 19:59:32

标签: python azure azure-storage

我期望使用Python azure-storage API能够生成一个Account SAS令牌,该令牌使我可以在存储帐户中的任何容器中读写blob。

SAS令牌的生成无一例外,但是当我尝试使用该SAS令牌创建BlockBlobService并列出给定容器的一些Blob时,我从Azure收到了AuthorizationPermissionMismatch错误。

我是否正确理解Account SAS令牌的概念?

我看过有关Azure的Python存储API“入门”文档的大量文档,也看过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令牌容器?

1 个答案:

答案 0 :(得分:0)

我回顾了函数generate_account_shared_access_signature的定义及其参数resource_typespermission,如下图所示。

图1.函数generate_account_shared_access_signature

的定义

enter image description here

图2。类ResourceTypes

的定义

enter image description here

图3.类AccountPermission

的定义

enter image description here

根据上述这些定义,我认为您的问题是由于使用+语法将这些资源类型和权限组合为所需的。

这是我的示例代码,可以很好地解决您的问题。

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))

希望有帮助。