Python 生成签名查询字符串 blob 返回错误的查询字符串

0 投票
1 回答
504 浏览
提问于 2025-04-17 18:48

我正在尝试使用Python SDK在一个私有的Azure Blob存储容器中分享一个blob,下面是我的代码:

try:
        accss_plcy = AccessPolicy()
        accss_plcy.start = '2013-03-12'
        accss_plcy.expiry = '2013-03-13'
        accss_plcy.permission = 'r'
        signed_identifier = 'YWJjZGVmZw=='
        sap = SharedAccessPolicy(accss_plcy, signed_identifier)
        qry_str = sas.generate_signed_query_string('picture/xxx.jpg','blob', sap)
    except Exception as ex:
        abort(400, 'Download blob fail %s'%ex)
    return sas._convert_query_string(qry_str)

下面是返回的查询字符串:

st=2013-03-12&se=2013-03-13&sp=r&resource=blob&sig=FI88prUINf58Seg5Nwo6Uj5RP9FxXGZBBSKi7pybmeQ=&

你可能会注意到这里有resource=blob,但它应该返回的是sr=b

我该如何解决这个问题呢?

1 个回答

2

看起来这是SDK里的一个bug。因为Azure SDK的代码是开源的,你可以下载代码并修改这个文件:https://github.com/WindowsAzure/azure-sdk-for-python/blob/master/src/azure/storage/sharedaccesssignature.py。查看这个文件的源代码后,你需要修改以下这一行代码(第129行):

convert_str += SIGNED_RESOURCE_TYPE + '=' + query_string[SIGNED_RESOURCE] + '&'

改成

convert_str += SIGNED_RESOURCE + '=' + query_string[SIGNED_RESOURCE] + '&'

另外,我注意到你在上面的代码中把blob当作资源类型传递:

qry_str = sas.generate_signed_query_string('picture/xxx.jpg','blob', sap)

你需要传递'b'而不是'blob'

qry_str = sas.generate_signed_query_string('picture/xxx.jpg','b', sap)

我觉得这样就可以解决问题了。另外,请确保在Github上提交一个bug,这样负责维护代码的团队就能修复它。

撰写回答