Azure 存储帐户 - 使用容器 SAS 的临时下载链接
Posted
技术标签:
【中文标题】Azure 存储帐户 - 使用容器 SAS 的临时下载链接【英文标题】:Azure Storage Account - temporary download link using container SAS 【发布时间】:2020-11-09 02:20:38 【问题描述】:我正在使用 Python Azure SDK,但遇到了以下问题。
我想要做的是生成容器 SAS 令牌以仅在给定容器上使用,为此我使用 Azure SDK generate_container_sas
def get_temporary_access_token(self):
sas_token = generate_container_sas(
self.account_name,
self.container_name,
self.storage_token,
permission=ContainerSasPermissions(read=True, write=True, delete=True, list=True),
expiry=datetime.utcnow() + self.sas_token_expiry_time
)
return sas_token
这会返回一个类似于se=<end_datetime>&sp=<Permission>&sv=2019-07-07&sr=c&sig=<token>
的字符串
现在使用这个令牌我可以做各种各样的事情,但我有麻烦的是使用这个链接作为某个 blob 的临时下载链接。
我试图用这种方法来做:
def get_temporary_download_link(self, blob_full_path, expires_time):
base_temp_url = f'self._get_base_resource_url()/self.container_name/blob_full_path'
token = generate_blob_sas(
account_name=self.account_name,
account_key=self.sas_token,
container_name=self.container_name,
blob_name=blob_full_path,
permission=BlobSasPermissions(read=True),
expiry=datetime.utcnow() + timedelta(seconds=expires_time)
)
return f'base_temp_url?token'
现在,当我尝试使用在上述方法中构建的链接时,我在以下方法 b64decode
中失败了。
据我所知,我不打算将 SAS 令牌用于临时下载链接,我只能通过使用资源令牌或用户委托对象来做到这一点?
我还尝试通过对 SAS 令牌进行编码来“愚弄”该方法,但导致 URL 出现错误Signature did not match
我没有找到任何关于我可以使用资源 SAS 令牌与 UserDelegationKey 做什么或不可以做什么的文档,有人知道是否可以使用资源 SAS 令牌进行临时下载?
提前致谢
【问题讨论】:
【参考方案1】:基本上,问题在于您使用 SAS 令牌(在您的情况下为 blob 容器创建)来创建新的 SAS 令牌。这是不允许的。您将需要使用帐户密钥或用户委托密钥来生成 SAS 令牌。
此外,您可以使用为 Blob 容器生成的 SAS 令牌作为该容器内 Blob 的 SAS 令牌。如果您为具有至少 read
权限的 blob 容器创建 SAS 令牌,则可以使用相同的 SAS 令牌下载该 blob 容器中的任何 blob。
【讨论】:
是的,我正在使用帐户密钥生成 SAS 令牌,但您让我发现我可以只使用 SAS 令牌作为下载 blob 的后缀而不使用get_temporary_download_link
,谢谢
以上是关于Azure 存储帐户 - 使用容器 SAS 的临时下载链接的主要内容,如果未能解决你的问题,请参考以下文章
在不使用主键或辅助键的情况下使用 azure 存储帐户进行身份验证
在 Java 中生成 SAS 令牌以下载 Azure 数据存储容器中的文件
Azure 存储帐户生成 SAS 令牌,而不是 SAS URI