Je mettez la mise à jour des scripts qui utilisaient l'ancien module de stockage Azure de Microsoft et la commutation du v12 sdk.

Je rencontre un problème générant des jetons SAS pour les blobs. Utilisation du code suivant:

from datetime import datetime, timedelta
from azure.storage.blob import (
    BlobServiceClient,
    BlobSasPermissions,
    generate_blob_sas,
)

client = BlobServiceClient(account_url=account_url, credential=account_key)
token = generate_blob_sas(
            account_name=client.account_name,
            account_key=client.credential.account_key,
            container_name="tempcontainer",
            blob_name="test.txt",
            permissions=BlobSasPermissions(read=True),
            expiry=datetime.utcnow() + timedelta(hours=1),
        )

Je reçois des jetons qui ressemblent à ceci:

SE = 2021-05-04T01% 3A50% 3A41Z & SV = 2020-06-12 & SR = B & SIG = ___________________________________________% 3D

Lorsque je tente d'utiliser pour télécharger la ressource renvoie l'erreur suivante:

<Error>
  <link type="text/css" rel="stylesheet" id="dark-mode-custom-link"/>
  <link type="text/css" rel="stylesheet" id="dark-mode-general-link"/>
  <style lang="en" type="text/css" id="dark-mode-custom-style"/>
  <style lang="en" type="text/css" id="dark-mode-native-style"/>
  <Code>AuthenticationFailed</Code>
  <Message>
      Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature. RequestId:7c78e0c4-001e-010f-6b7f-40cd26000000 Time:2021-05-04T00:48:24.8329422Z
  </Message>
  <AuthenticationErrorDetail>sp is mandatory. Cannot be empty</AuthenticationErrorDetail>
</Error>

En utilisant le même compte et les mêmes informations d'identification, je suis toujours capable de générer des jetons SAS avec la version plus ancienne:

from azure.storage.blob import BlockBlobService, ContainerPermissions

token = self.client.generate_blob_shared_access_signature(
    "tempcontainer",
    "test.txt",
    ContainerPermissions.READ,
    datetime.now() + duration,
)

Qui produit des jetons de travail, avec le paramètre "SP" de requête étant inclus.

SE = 2021-06-03T16% 3A57% 3A59Z & SP = R & SV = 2017-04-17 & SR = B & SIG = ___________________________________________% 3D

J'ai également testé avec Azure Storage Explorateur pour vérifier que le compte / la clé que j'utilise n'est pas le problème, et je suis capable de générer des liens SAS via cet outil également.

Voici la sortie de pip list et de tous les modules Azure installés dans mon VENV:

azure-common                  1.1.25
azure-core                    1.13.0
azure-identity                1.3.1
azure-keyvault-secrets        4.1.0
azure-mgmt-core               1.2.2
azure-mgmt-keyvault           2.2.0
azure-storage-blob            12.8.1

Y a-t-il quelque chose que je fais mal avec le nouveau SDK pour générer ces jetons SAS? Est-ce en quelque sorte un jeton différent, ou il y a un paramètre supplémentaire qui me manque? Peut-être un moyen différent / meilleur de générer des jetons SAS avec cette nouvelle version?

Merci beaucoup d'avance pour toute aide!

1
mr.plow 4 mai 2021 à 04:09

1 réponse

Meilleure réponse

Dans votre code utilisant V12 SDK, pour generate_blob_sas fonction, le nom de paramètre doit être permission au lieu de permissions

Ceci est mon code de test basé sur le code que vous avez partagé:

from datetime import datetime, timedelta
from azure.storage.blob import (
    BlobSasPermissions,
    generate_blob_sas
)

token = generate_blob_sas(
            account_name='<account name>',
            account_key='<account key>',
            container_name='<container name>',
            blob_name='<blob name>',
            permission=BlobSasPermissions(read=True),
            expiry=datetime.utcnow() + timedelta(hours=1),
        )

print(token)

Résultat:

enter image description here enter image description here

1
Stanley Gong 4 mai 2021 à 01:32