จะแสดงรายการ Blobs ทั้งหมดโดยใช้ Azure Storage Account SAS Token ได้อย่างไร

การใช้ Python azure-storage API ฉันคาดว่าจะสามารถสร้างโทเค็นบัญชี SAS ซึ่งช่วยให้ฉันสามารถอ่านและเขียน blobs ในคอนเทนเนอร์ใดก็ได้ในบัญชีที่เก็บข้อมูลของฉัน

การสร้างโทเค็น SAS ดำเนินไปโดยไม่มีข้อยกเว้น แต่เมื่อฉันพยายามสร้าง BlockBlobService โดยใช้โทเค็น SAS นั้นและแสดงรายการ blobs บางส่วนสำหรับคอนเทนเนอร์ที่กำหนด ฉันได้รับข้อผิดพลาด AuthorizationPermissionMismatch จาก Azure

ฉันเข้าใจแนวคิดของโทเค็นบัญชี SAS ถูกต้องหรือไม่

ฉันได้ดูเอกสารจำนวนมากเกี่ยวกับเอกสาร "การเริ่มต้นใช้งาน" ของ Azure สำหรับ Python Storage 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 Token โดยไม่คำนึงถึงคอนเทนเนอร์นั้น

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
Gaurav คุณกำลังทำอะไรสักอย่าง เพียงแค่ใช้การอนุญาตรายการก็ทำให้ฉันสามารถแสดงรายการ blobs ในคอนเทนเนอร์ได้ นี่เป็นการเริ่มต้นที่ดี ตอนนี้ฉันต้องหาวิธีเขียนรายการ อ่าน เขียน และสร้าง!   -  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)


ฉันตรวจสอบคำจำกัดความของฟังก์ชัน 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))

หวังว่ามันจะช่วยได้

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