返回
如何避免 Azure 存储 Blob SAS 令牌中常见的“签名不匹配”错误?
python
2024-05-23 08:37:09
使用 Python 生成有效的 Blob SAS 令牌
引言
使用 Azure 存储 Blob 服务处理数据时,安全地访问和共享数据至关重要。共享访问签名 (SAS) 令牌提供了一种灵活且可定制的方式来授权对 Blob 的有限访问。然而,在生成 SAS 令牌时,签名不匹配错误是一个常见的痛点。本文将深入探讨此错误的潜在原因,并指导你如何解决此问题,确保你能够生成有效的 Blob SAS 令牌。
问题:签名不匹配
当你尝试使用 generate_blob_sas
函数生成 Blob SAS 令牌时,你可能会遇到签名不匹配的错误。此错误通常是由以下原因引起的:
- 服务版本 (sv) 设置不正确。
sv
参数指定用于生成 SAS 令牌的 Azure 存储服务版本。对于生成 Blob SAS 令牌,它应该设置为2023-11-03
。 - 资源 URL 不正确。
generate_blob_sas
函数需要一个正确的资源 URL,其中包含存储帐户名称、容器名称和 Blob 名称。确保你提供的 URL 与你正在尝试访问的 Blob 匹配。 - 共享访问权限设置不正确。
BlobSasPermissions
类用于设置 SAS 令牌的权限。确保你指定的权限(在本例中为读取权限)与你所需的权限相匹配。 - 时区设置不正确。
start
和expiry
参数都应指定为 UTC 时区中的日期时间对象。确保你使用timezone.utc
来创建这些对象。
解决方案
要解决签名不匹配错误并生成有效的 Blob SAS 令牌,请遵循以下步骤:
- 确保
sv
参数设置为2023-11-03
。 - 检查资源 URL 是否正确,并且它与你正在尝试访问的 Blob 匹配。
- 确保
BlobSasPermissions
类中的权限设置与你所需的权限相匹配。 - 确保
start
和expiry
参数指定为 UTC 时区中的日期时间对象。
示例代码
以下是使用 generate_blob_sas
函数生成 Blob SAS 令牌的示例代码,其中解决了上面提到的潜在问题:
import datetime
from datetime import timezone
from azure.storage.blob import generate_blob_sas
# 设置存储帐户名称、容器名称和 Blob 名称
account_name = "my-storage-account"
container_name = "my-container"
blob_name = "my-blob"
# 设置帐户访问密钥
account_key = "my-account-key"
# 设置开始时间和到期时间
start_time = datetime.now(timezone.utc)
expiry_time = start_time + timedelta(days=1)
# 使用 BlobSasPermissions 类设置权限
permissions = BlobSasPermissions(read=True)
# 使用 generate_blob_sas 函数生成 SAS 令牌
sas_token = generate_blob_sas(
account_name=account_name,
container_name=container_name,
blob_name=blob_name,
account_key=account_key,
permission=permissions,
expiry=expiry_time,
start=start_time,
sv="2023-11-03" # 设置服务版本
)
# 构造 SAS URL
sas_url = f"https://{account_name}.blob.core.windows.net/{container_name}/{blob_name}?{sas_token}"
print(sas_url)
结论
通过解决签名不匹配错误,你可以生成有效的 Blob SAS 令牌,从而安全且便捷地访问和共享存储在 Azure 存储中的数据。通过遵循本文中概述的步骤,你可以避免常见的错误并确保你的 SAS 令牌始终有效。
常见问题解答
1. 如何检查 Blob SAS 令牌是否有效?
- 使用 Azure 存储资源管理器或 Azure 门户中的“测试 SAS 令牌”功能。
2. 如何管理 Blob SAS 令牌?
- 使用 Azure 存储管理库或通过 Azure 门户。
3. SAS 令牌的最大有效期是多少?
- 365 天(大约 1 年)。
4. 可以同时生成多个 SAS 令牌吗?
- 可以,对于同一 Blob 或容器可以生成多个 SAS 令牌。
5. 如何吊销 Blob SAS 令牌?
- 目前无法吊销 Blob SAS 令牌,因此在创建 SAS 令牌时应谨慎考虑。