0

我正在使用 Python Azure SDK,但遇到了以下问题。

我想要做的是生成仅在给定容器上使用的容器 SAS 令牌,为此我使用 Azure SDKgenerate_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 令牌进行临时下载?

提前致谢

4

1 回答 1

0

基本上问题是您正在使用 SAS 令牌(在您的情况下为 blob 容器创建)来创建新的 SAS 令牌。这是不允许的。您将需要使用帐户密钥或用户委托密钥来生成 SAS 令牌。

此外,您可以使用为 blob 容器生成的 SAS 令牌作为该容器内的 blob 的 SAS 令牌。如果为具有至少read权限的 blob 容器创建 SAS 令牌,则可以使用相同的 SAS 令牌下载该 blob 容器中的任何 blob。

于 2020-07-20T00:03:30.617 回答