返回

如何避免 Azure 存储 Blob SAS 令牌中常见的“签名不匹配”错误?

python

使用 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 令牌的权限。确保你指定的权限(在本例中为读取权限)与你所需的权限相匹配。
  • 时区设置不正确。 startexpiry 参数都应指定为 UTC 时区中的日期时间对象。确保你使用 timezone.utc 来创建这些对象。

解决方案

要解决签名不匹配错误并生成有效的 Blob SAS 令牌,请遵循以下步骤:

  1. 确保 sv 参数设置为 2023-11-03
  2. 检查资源 URL 是否正确,并且它与你正在尝试访问的 Blob 匹配。
  3. 确保 BlobSasPermissions 类中的权限设置与你所需的权限相匹配。
  4. 确保 startexpiry 参数指定为 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 令牌时应谨慎考虑。