我期望使用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令牌容器?
答案 0 :(得分:0)
我回顾了函数generate_account_shared_access_signature
的定义及其参数resource_types
和permission
,如下图所示。
图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))
希望有帮助。