Как создать подпись для маркера SAS хранилища BLOB-объектов Azure в Python?
Я пытаюсь создать токен SAS, необходимый для загрузки URL-адреса большого двоичного объекта в Python, следуя инструкциям MSDN.
Моя строка для подписи выглядит так:
r\n
2016-12-22T14%3A00%3A00Z\n
2016-12-22T15%3A00%3A00Z\n
%2Fblob%2Fmytest%2Fprivatefiles%2F1%2Fqux.txt\n
\n
\n
https\n
2015-12-11\n
\n
\n
\n
\n
_
Я добавил символы новой строки для ясности, и последняя строка должна быть пустой строкой (без новой строки в конце).
Метод Python, который я использую для подписания строки:
def sign(self, string):
hashed = hmac.new(base64.b64decode(self.account_key), digestmod=sha256)
hashed.update(string)
base64_str = base64.encodestring(hashed.digest()).strip()
return base64_str
Последний URL, который я создаю, выглядит следующим образом:
Тем не менее, URL-адрес с ошибкой 403. Есть идеи, что я делаю не так?
2 ответа
На основе documentation
(Посмотри пожалуйста Constructing the Signature String
раздел), параметры, передаваемые в строку для подписи, должны быть декодированы URL. По ссылке:
Чтобы создать строку подписи для подписи общего доступа, сначала создайте строку для подписи из полей, содержащих запрос, затем закодируйте строку как UTF-8 и вычислите подпись, используя алгоритм HMAC-SHA256. Обратите внимание, что поля, включенные в строку для подписи, должны быть декодированы по URL.
Пожалуйста, используйте некодированные значения параметров в вашей строке для подписи, и это должно решить проблему.
Обновите, с последней библиотекой хранилища Python, это то, что я использовал для создания токена sas:
def generate_sas_token(file_name):
sas = generate_blob_sas(account_name=AZURE_ACC_NAME,
account_key=AZURE_PRIMARY_KEY,
container_name=AZURE_CONTAINER,
blob_name=file_name,
permission=BlobSasPermissions(read=True),
expiry=datetime.utcnow() + timedelta(hours=2))
logging.info('https://'+AZURE_ACC_NAME+'.blob.core.windows.net/'+AZURE_CONTAINER+'/'+file_name+'?'+sas)
sas_url ='https://'+AZURE_ACC_NAME+'.blob.core.windows.net/'+AZURE_CONTAINER+'/'+file_name+'?'+sas
return sas_url
Python 3.6 и azure-storage-blob
пакет.
Самый простой способ создания токена SAS в python - это использовать Azure Storage SDK для Python. Пожалуйста, рассмотрите следующий фрагмент кода:
import time
import uuid
import hmac
import base64
import hashlib
import urllib
from datetime import datetime, timedelta
from azure.storage import (
AccessPolicy,
ResourceTypes,
AccountPermissions,
CloudStorageAccount,
)
from azure.storage.blob import (
BlockBlobService,
ContainerPermissions,
BlobPermissions,
PublicAccess,
)
AZURE_ACC_NAME = '<account_name>'
AZURE_PRIMARY_KEY = '<account_key>'
AZURE_CONTAINER = '<container_name>'
AZURE_BLOB='<blob_name>'
def generate_sas_with_sdk():
block_blob_service = BlockBlobService(account_name=AZURE_ACC_NAME, account_key=AZURE_PRIMARY_KEY)
sas_url = block_blob_service.generate_blob_shared_access_signature(AZURE_CONTAINER,AZURE_BLOB,BlobPermissions.READ,datetime.utcnow() + timedelta(hours=1))
#print sas_url
print 'https://'+AZURE_ACC_NAME+'.blob.core.windows.net/'+AZURE_CONTAINER+'/'+AZURE_BLOB+'?'+sas_url
generate_sas_with_sdk()
Кроме того, чтобы сгенерировать токен SAS с помощью обычного сценария Python, вы можете обратиться к исходному коду по адресу https://github.com/Azure/azure-storage-python/blob/master/azure/storage/sharedaccesssignature.py для получения дополнительной информации. намеки.
Вот обновленный фрагмент кода для Python3 и обновленный пакет SDK для хранилища BLOB-объектов Azure:
from datetime import datetime, timedelta
from azure.storage.blob import (
BlockBlobService,
ContainerPermissions,
BlobPermissions,
PublicAccess,
)
AZURE_ACC_NAME = '<account_name>'
AZURE_PRIMARY_KEY = '<account_key>'
AZURE_CONTAINER = '<container_name>'
AZURE_BLOB='<blob_name>'
block_blob_service = BlockBlobService(account_name=AZURE_ACC_NAME, account_key=AZURE_PRIMARY_KEY)
sas_url = block_blob_service.generate_blob_shared_access_signature(AZURE_CONTAINER,AZURE_BLOB,permission=BlobPermissions.READ,expiry= datetime.utcnow() + timedelta(hours=1))
print('https://'+AZURE_ACC_NAME+'.blob.core.windows.net/'+AZURE_CONTAINER+'/'+AZURE_BLOB+'?'+sas_url)