【问题标题】:Signature did not match on generated Azure SAS download link?生成的 Azure SAS 下载链接上的签名不匹配?
【发布时间】:2015-03-26 17:40:29
【问题描述】:

我一直在尝试让共享访问签名适用于 Azure Blob 存储,因为我想提供限时下载。为此,我目前使用在 Azure 网站服务上调用 Python 脚本的 PHP 脚本。

这是我用来测试事物的方式:

<?php echo "https://container.blob.core.windows.net/bla/random.zip?"; system('azureapp\Scripts\python azureapp\generate-sas.py "folder/file.zip"'); ?>

这是我用来生成参数的python脚本:

from azure.storage import *
import sys, datetime

file = sys.argv[1]
accss_plcy = AccessPolicy()
accss_plcy.start = (datetime.datetime.utcnow() + datetime.timedelta(seconds=-120)).strftime('%Y-%m-%dT%H:%M:%SZ')
accss_plcy.expiry = (datetime.datetime.utcnow() + datetime.timedelta(seconds=15)).strftime('%Y-%m-%dT%H:%M:%SZ')
accss_plcy.permission = 'r'
sap = SharedAccessPolicy(accss_plcy)
sas = SharedAccessSignature('containername', 'accountkey')
qry_str = sas.generate_signed_query_string(file, 'b', sap)
print (sas._convert_query_string(qry_str))

我设法让这个构造在大部分情况下运行,但我目前的问题是,如果我使用生成的链接,我现在总是面临这个错误:

<Message>
Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature. 
</Message>
<AuthenticationErrorDetail>
Signature did not match. String to sign used was r 2015-01-27T22:52:17Z 2015-01-27T22:54:32Z /filepath/random.zip 2012-02-12
</AuthenticationErrorDetail>

我仔细检查了所有内容,并试图在 Google 上找到一些东西,但遗憾的是,这方面并没有得到很好的记录,而且错误消息也没有真正帮助我。

编辑:忘记留下生成的示例链接:https://container.blob.core.windows.net/filepath/random.zip?st=2015-01-27T23%3A23%3A18Z&se=2015-01-27T23%3A26%3A18Z&sp=r&sr=b&sv=2012-02-12&sig=eqCirXRjUbGGVVAYwWwARreTPr4j8wXubGx1q51AUHU%3D&

【问题讨论】:

  • 我没有看到您在 SAS 计算中的任何位置添加 blob 容器的名称。我刚刚在我的一个存储帐户上尝试了您的代码,并且代码运行良好。
  • 在我的本地版本中,我在获取查询字符串之前应用容器名称,例如SharedAccessSignature('shopdownloads', 'accountkey---------------')。我认为这应该足够了?
  • 那是账户名。假设您的容器名称为bla,文件名称为random.zip,请将以下代码从&lt;?php echo "https://container.blob.core.windows.net/bla/random.zip?"; system('azureapp\Scripts\python azureapp\generate-sas.py "folder/file.zip"'); ?&gt; 更改为&lt;?php echo "https://container.blob.core.windows.net/bla/random.zip?"; system('azureapp\Scripts\python azureapp\generate-sas.py "bla/random.zip"'); ?&gt;
  • 做到了!不敢相信我花了几个小时寻找那个小错误......你能把它作为一个完整的答案发布,以便我可以将你的答案标记为正确吗?

标签: python azure azure-storage


【解决方案1】:

假设您的容器名称为bla,文件名称为random.zip,请更改以下代码:

<?php echo "https://container.blob.core.windows.net/bla/random.zip?"; system('azureapp\Scripts\python azureapp\generate-sas.py "folder/file.zip"'); ?> 

到:

<?php echo "https://container.blob.core.windows.net/bla/random.zip?"; system('azureapp\Scripts\python azureapp\generate-sas.py "bla/random.zip"'); ?>

您遇到此错误的原因是您没有在 SAS 计算例程中提供 blob 容器的名称,因此存储服务正在计算 $root blob 容器上的 SAS。由于 SAS 是在一个 blob 容器上计算并在另一个 blob 容器上使用的,因此您会收到此授权错误。

【讨论】:

    猜你喜欢
    • 2020-05-29
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    • 2021-03-05
    • 2022-06-17
    相关资源
    最近更新 更多