Как создать подпись общего доступа для контейнера с помощью Azure Python SDK

Я пытаюсь создать действительный URL-адрес подписи общего доступа для контейнера в хранилище Azure, используя Azure Python SDK. Я пытаюсь сгенерировать его, чтобы он сразу вступил в силу, истекает через 30 дней и дает доступ на чтение и запись ко всему контейнеру (не только к BLOB-объекту). Приведенный ниже код работает нормально, и он печатает окончательный URL в конце. Я также вручную проверил на портале, что контейнер и BLOB-объекты были успешно созданы.

Однако после вставки URL-адреса в браузер я получаю следующее сообщение об ошибке:

<?xml version="1.0" encoding="UTF-8"?>

-<Error>

<Code>AuthenticationFailed</Code>

<Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature. RequestId:adecbe4e-0001-007c-0d19-40670c000000 Time:2015-12-26T20:10:45.9030215Z</Message>

<AuthenticationErrorDetail>Signature fields not well formed.</AuthenticationErrorDetail>

</Error>

Кажется, проблема должна быть с этой строкой кода:

sasToken = blob_service.generate_shared_access_signature(containerName, None,SharedAccessPolicy(AccessPolicy(None, todayPlusMonthISO, "rw"), None))

Вот полный пример кода:

from azure.storage.blob import BlobService
import datetime
from azure.storage import AccessPolicy, CloudStorageAccount, SharedAccessPolicy

containerName = "testcontainer"
blobName = "testblob.txt"
azureStorageAccountName = "" # Removed for publishing to Stackru
azureStorageAccountKey = "" # Removed for publishing to Stackru
blob_service = BlobService(account_name=azureStorageAccountName, account_key=azureStorageAccountKey)
blob_service.create_container(containerName)
blob_service.put_block_blob_from_text(containerName,blobName,"Hello World")
today = datetime.datetime.utcnow()
todayPlusMonth = today + datetime.timedelta(30)
todayPlusMonthISO = todayPlusMonth.isoformat()
sasToken = blob_service.generate_shared_access_signature(containerName, None,SharedAccessPolicy(AccessPolicy(None, todayPlusMonthISO, "rw"), None))
url = "https://" + azureStorageAccountName + ".blob.core.windows.net/" + containerName + "/" + blobName + "?" + sasToken
print(url)

Любые идеи, как это исправить? Спасибо!

1 ответ

Решение

Метод isoformat добавляет микросекунды к строке, AFAICT, это недопустимо в ISO8601.

Если вы измените свой код следующим образом:

todayPlusMonthISO = todayPlusMonth.replace(microsecond=0).isoformat() + 'Z'

Сгенерированная строка становится действительной.

Например, прежде чем вы имели:

2016-01-03T21: 04: 10,545430

Изменение преобразует его в действительное:

2016-01-03T21: 04: 10Z

Другие вопросы по тегам