Azure Blob 存储 SAS 令牌缺少服务资源字段

Dar*_*lis 4 python azure azure-storage-blobs

我使用 Web 界面在我的 Azure 存储帐户上创建了一个共享访问签名 (SAS) 令牌。令牌看起来像

?sv=xxxx-xx-xx&ss=b&srt=sco&sp=rl&se=xxxx-xx-xxTxx:xx:xxZ&st=xxxx-xx-xxTxx:xx:xxZ&spr=https&sig=xxxxxxxxxxxxxxxxxxxxxx

此处的 SAS 令牌缺少sr服务资源字段。我必须手动将 附加sr=b到查询字符串才能使事情正常工作。我一定是做错了什么,因为这看起来非常挑剔。

from azure.storage.blob import BlockBlobService
sas_token = "?sv=xxxx-xx-xx&ss=b&srt=sco&sp=rl&se=xxxx-xx-xxTxx:xx:xxZ&st=xxxx-xx-xxTxx:xx:xxZ&spr=https&sig=xxxxxxxxxxxxxxxxxxxxxx"
sas_token = "?sr=b&" + sas_token[1:]

serv = BlockBlobService(account_name='myaccount', sas_token=sas_token)

for cont in serv.list_containers():
    print cont.name
Run Code Online (Sandbox Code Playgroud)

没有sas_token = "?sr=b&" + sas_token[1:]我得到错误:

sr 是强制性的。不能为空

如果该sr=b字段不是查询中的第一个,我会收到一个身份验证错误,例如

没有签名标识符的访问时间窗口不能超过 1 小时

Aar*_*hen 8

没有签名标识符的访问时间窗口不能超过 1 小时

基于此错误信息,您可能需要设置过期时间小于从现在起1小时。请参阅Windows Azure 共享访问签名总是给出:禁止 403


我把你的代码Python v2.7.12@azure-storage-python v0.34.3(最新版本)一起带走了。它在我的网站上运行良好。所以,我建议你升级到最新版本,然后再试一次。

在此处输入图片说明

更新:

我跟踪了用于 Python 的 Azure 存储 SDK 的代码,这是我发现的内容。SDK 是一个 REST API 变形器,它假定 SAS 令牌如下所示:

sv=2015-04-05&ss=bfqt&srt=sco&sp=rl&se=2015-09-20T08:49Z&sip=168.1.5.60-168.1.5.70&sig=a39%2BYozJhGp6miujGymjRpN8tsrQfLo9Z3i8IRyIpnQ%3d
Run Code Online (Sandbox Code Playgroud)

如您所见,令牌不包括?. 当 SDK?向 Azure 存储 REST 服务发出 GET 请求时,它会附加在 SAS 令牌之前。

在此处输入图片说明

这将导致签名版本的密钥被解析为?sv,然后引发了问题。因此,为了避免这种情况,我们应该?从 SAS 令牌中删除。

  • 只需从 SAS 令牌中删除`?`。我已经用详细信息更新了我的答案。 (2认同)
  • 这就像最好的答案救了我的命,因为我忽略了那个双“?”。如果能从 MS 获得正确的格式错误的 url 错误或有用的信息,那就太好了。 (2认同)