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

时间:2017-07-06 21:20:38

标签: python azure azure-storage-blobs

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

  

SV =为xxxx-xxxx&安培; 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

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

  

sr是强制性的。不能为空

如果sr=b字段不是查询中的第一个,我会收到类似

的身份验证错误
  

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

1 个答案:

答案 0 :(得分:2)

  

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

根据此错误消息,您可能需要在1小时后设置小于的到期时间。请参阅Windows Azure Shared Access Signature always gives: Forbidden 403

我使用Python v2.7.12@azure-storage-python v0.34.3(最新版本)获取了代码。它在我的网站上运行良好。因此,我建议您升级到最新版本并再试一次。

enter image description here

<强>更新

我跟踪了code of Azure Storage SDK for Python以及我发现的内容。 SDK是一个REST API warpper,它假定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

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

enter image description here

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