如何在 Python 中生成 Azure Blob 存储 SAS 令牌的签名?

问题描述 投票:0回答:4

我正在尝试按照 MSDN 中的说明,在 Python 中构建 blob 下载 URL 所需的 SAS 令牌。

我的签名字符串如下所示:

r\n
2016-12-22T14%3A00%3A00Z\n
2016-12-22T15%3A00%3A00Z\n
%2Fblob%2Fmytest%2Fprivatefiles%2F1%2Fqux.txt\n
\n
\n
https\n
2015-12-11\n
\n
\n
\n
\n
_

为了清楚起见,我添加了换行符,最后一行应该是空行(末尾没有换行符)。

我用于签名字符串的Python方法是:

def sign(self, string):
    hashed = hmac.new(base64.b64decode(self.account_key), digestmod=sha256)
    hashed.update(string)
    base64_str = base64.encodestring(hashed.digest()).strip()
    return base64_str

我构建的最终 URL 如下所示:

https://mytest.blob.core.windows.net/privatefiles/1/qux.txt?sv=2015-12-11&st=2016-12-22T14%3A00%3A00Z&se=2016-12-22T15%3A00% 3A00Z&sr=b&sp=r&spr=https&sig=BxkcpoRq3xanEHwU6u5%2FYsULEtOCJebHmupUZaPmBgM%3D

尽管如此,URL 仍然失败并显示 403。知道我做错了什么吗?

python azure authentication azure-blob-storage
4个回答
11
投票

更新,使用最新的存储python库,这是我用来生成sas令牌的:

from azure.storage.blob import generate_blob_sas, BlobSasPermissions
def generate_sas_token(file_name):
    sas = generate_blob_sas(account_name=AZURE_ACC_NAME,
                            account_key=AZURE_PRIMARY_KEY,
                            container_name=AZURE_CONTAINER,
                            blob_name=file_name,
                            permission=BlobSasPermissions(read=True),
                            expiry=datetime.utcnow() + timedelta(hours=2))

    logging.info('https://'+AZURE_ACC_NAME+'.blob.core.windows.net/'+AZURE_CONTAINER+'/'+file_name+'?'+sas)
    sas_url ='https://'+AZURE_ACC_NAME+'.blob.core.windows.net/'+AZURE_CONTAINER+'/'+file_name+'?'+sas
    return sas_url

Python 3.6 和

azure-storage-blob
包。 https://pypi.org/project/azure-storage-blob/


8
投票

在 python 中生成 SAS 令牌的最简单方法是利用 Azure Storage SDK for Python。请考虑以下代码片段:

import time
import uuid
import hmac
import base64
import hashlib
import urllib
from datetime import datetime, timedelta
from azure.storage import (
    AccessPolicy,
    ResourceTypes,
    AccountPermissions,
    CloudStorageAccount,
)
from azure.storage.blob import (
    BlockBlobService,
    ContainerPermissions,
    BlobPermissions,
    PublicAccess,
)

AZURE_ACC_NAME = '<account_name>'
AZURE_PRIMARY_KEY = '<account_key>'
AZURE_CONTAINER = '<container_name>'
AZURE_BLOB='<blob_name>'

def generate_sas_with_sdk():
    block_blob_service = BlockBlobService(account_name=AZURE_ACC_NAME, account_key=AZURE_PRIMARY_KEY)    
    sas_url = block_blob_service.generate_blob_shared_access_signature(AZURE_CONTAINER,AZURE_BLOB,BlobPermissions.READ,datetime.utcnow() + timedelta(hours=1))
    #print sas_url
    print 'https://'+AZURE_ACC_NAME+'.blob.core.windows.net/'+AZURE_CONTAINER+'/'+AZURE_BLOB+'?'+sas_url

generate_sas_with_sdk()

此外,要通过纯Python脚本生成SAS令牌,您可以参考源代码https://github.com/Azure/azure-storage-python/blob/master/azure/storage/sharedaccesssignature.py#L173 获取更多提示。


6
投票

以下是 Python3 的更新代码片段和更新的 Azure Storage Blob SDK:

from datetime import datetime, timedelta
from azure.storage.blob import (
    BlockBlobService,
    ContainerPermissions,
    BlobPermissions,
    PublicAccess,
)

AZURE_ACC_NAME = '<account_name>'
AZURE_PRIMARY_KEY = '<account_key>'
AZURE_CONTAINER = '<container_name>'
AZURE_BLOB='<blob_name>'

block_blob_service = BlockBlobService(account_name=AZURE_ACC_NAME, account_key=AZURE_PRIMARY_KEY)
sas_url = block_blob_service.generate_blob_shared_access_signature(AZURE_CONTAINER,AZURE_BLOB,permission=BlobPermissions.READ,expiry= datetime.utcnow() + timedelta(hours=1))
print('https://'+AZURE_ACC_NAME+'.blob.core.windows.net/'+AZURE_CONTAINER+'/'+AZURE_BLOB+'?'+sas_url)

2
投票

基于

documentation
(请参阅
Constructing the Signature String
部分),传递给要签名的字符串的参数必须经过URL解码。来自链接:

要构造共享访问签名的签名字符串,首先 从包含请求的字段构造要签名的字符串, 然后将字符串编码为 UTF-8 并使用以下方法计算签名 HMAC-SHA256 算法。 请注意,待签名字符串中包含的字段 必须经过 URL 解码。

请在字符串中使用未编码的参数值进行签名,这应该可以解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.