2017-07-06 68 views
0

我使用Web界面在Azure存储帐户上创建了共享访问签名(SAS)令牌。令牌看起来像Azure Blob Store 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 

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

sr is mandatory. Cannot be empty

而且如果sr=b字段不是第一次查询,我得到一个验证错误,如

Access without signed identifier cannot have time window more than 1 hour

+0

您使用的是什么版本的Python SDK? –

+0

我使用python 2.7.6和azure-storage 0.34.3 –

回答

1

Access without signed identifier cannot have time window more than 1 hour

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


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

enter image description here

UPDATE:

我跟踪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 

正如你所看到的,令牌不包括?。当它向SAS Azure存储REST服务发出GET请求时,SDK将在SAS令牌之前附加?

enter image description here

这将导致该的签名版本的密钥被解析为?sv,那么它提出的问题。所以,为了避免这种情况,我们应该从SAS令牌中删除?

+0

上面的代码确实有效。我的问题是,修改SAS令牌似乎是错误的方法。我应该可以使用未经修改的SAS令牌对Azure存储帐户进行身份验证和查询。 –

+1

只需从SAS令牌中删除'?'。我已经用细节更新了我的答案。 –