Bagaimana Cara Mendaftar semua Blob menggunakan Token SAS Akun Penyimpanan Azure?

Dengan menggunakan API Python azure-storage saya berharap dapat membuat token Akun SAS yang memungkinkan saya membaca dan menulis blob dalam wadah apa pun di akun penyimpanan saya.

Pembuatan token SAS berjalan tanpa pengecualian, tetapi ketika saya mencoba membuat BlockBlobService menggunakan token SAS tersebut dan mencantumkan beberapa gumpalan untuk wadah tertentu, saya mendapatkan kesalahan AuthorizationPermissionMismatch dari Azure.

Apakah saya memahami konsep token Akun SAS dengan benar?

Saya telah melihat banyak dokumentasi tentang dokumentasi "Memulai" Azure untuk Python Storage API, saya juga telah melihat melalui https://azure-storage.readthedocs.io/ref/azure.storage.blob.sharedaccesssignature.html cukup banyak.

Saya telah mencoba menggunakan azure.storage.blob.BlockBlobService.generate_account_shared_access_signature() dengan izin yang sangat permisif dan masih mendapatkan pengecualian.

Saya dapat mengonfirmasi bahwa azure.storage.blob.BlockBlobService.generate_container_shared_access_signature() berfungsi dengan baik, namun persyaratan saya adalah membuat Token SAS terlepas dari wadahnya.

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>

Saya berharap dapat menelepon list_blobs() di sini tidak masalah. Bagaimana saya bisa mencapai ini tanpa harus membuat wadah SAS Token demi wadah?


person Austin T    schedule 26.07.2019    source sumber
comment
Bisakah Anda membagikan token SAS yang dihasilkan oleh kode Anda?   -  person Gaurav Mantri    schedule 26.07.2019
comment
Token SAS Anda baru saja memiliki izin pembuatan (sp=c). Bisakah Anda mencoba membuat token SAS hanya dengan izin daftar?   -  person Gaurav Mantri    schedule 27.07.2019
comment
Gaurav kamu sedang melakukan sesuatu. Hanya menggunakan izin daftar memungkinkan saya membuat daftar gumpalan dalam wadah. Ini adalah awal yang baik - sekarang saya harus memikirkan cara membuat daftar, membaca, menulis, dan membuat!   -  person Austin T    schedule 27.07.2019
comment
Fantastis! Saya akan merekomendasikan melihat kode sumber SDK untuk mengetahui mengapa izin tidak disetel dengan benar. Kode Anda terlihat baik-baik saja bagi saya.   -  person Gaurav Mantri    schedule 27.07.2019
comment
Saya setuju - mungkin ada sesuatu yang terjadi pada kode sumber SDK. Tidak ada dokumentasi yang memberi tahu saya bahwa saya tidak dapat memiliki banyak izin untuk beberapa jenis layanan. docs.microsoft.com/en-us/ istirahat/api/layanan penyimpanan/   -  person Austin T    schedule 27.07.2019
comment
Menunggu masukan dari tim Azure mengenai masalah yang saya buka tentang ini: github .com/Azure/azure-storage-python/issues/621   -  person Austin T    schedule 28.07.2019


Jawaban (1)


Saya meninjau definisi fungsi generate_account_shared_access_signature dan parameternya resource_types & permission, seperti gambar di bawah ini.

Gambar 1. Definisi fungsi generate_account_shared_access_signature

masukkan deskripsi gambar di sini

Gambar 2. Definisi kelas ResourceTypes

masukkan deskripsi gambar di sini

Gambar 3. Definisi kelas AccountPermission

masukkan deskripsi gambar di sini

Berdasarkan definisi di atas, menurut saya masalah Anda disebabkan oleh penggunaan sintaks + untuk menggabungkan jenis sumber daya dan izin sesuai keinginan Anda.

Ini adalah contoh kode saya yang berfungsi dengan baik tanpa masalah seperti milik Anda.

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

Semoga ini bisa membantu.

person Peter Pan    schedule 29.07.2019
comment
Terima kasih Peter, saya akan mencoba metode ini - sementara itu, contoh Memulai dari Azure (baris 200-203) yang tidak berfungsi untuk saya github.com/Azure-Samples/storage-blob-python-getting-started/ - person Austin T; 30.07.2019