我使用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小时
答案 0 :(得分:2)
没有签名标识符的访问时间窗口不能超过1小时
根据此错误消息,您可能需要在1小时后设置小于的到期时间。请参阅Windows Azure Shared Access Signature always gives: Forbidden 403。
我使用Python v2.7.12
和@azure-storage-python v0.34.3(最新版本)获取了代码。它在我的网站上运行良好。因此,我建议您升级到最新版本并再试一次。
<强>更新强>
我跟踪了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令牌之前附加?
。
这会导致签名版本的密钥被解析为?sv
,然后它引发了问题。因此,为了避免这种情况,我们应该从SAS令牌中删除?
。