adr*_*anp 4 python authentication azure azure-storage-blobs
我正在尝试按照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
_
Run Code Online (Sandbox Code Playgroud)
为了清楚起见,我添加了换行符,最后一行应该是一个空行(末尾没有换行符)。
我用于对字符串进行签名的 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
Run Code Online (Sandbox Code Playgroud)
我构建的最终 URL 如下所示:
仍然,URL 失败并显示 403。知道我做错了什么吗?
更新,使用最新的存储python库,这是我用来生成sas令牌的:
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
Run Code Online (Sandbox Code Playgroud)
Python 3.6 和azure-storage-blob包。
在 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()
Run Code Online (Sandbox Code Playgroud)
此外,要通过纯 python 脚本生成 SAS 令牌,您可以参考https://github.com/Azure/azure-storage-python/blob/master/azure/storage/sharedaccesssignature.py#L173上的源代码了解更多信息提示。
小智 6
以下是 Python3 的更新代码片段和更新的 Azure 存储 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)
Run Code Online (Sandbox Code Playgroud)
根据documentation(请参阅Constructing the Signature String部分),传递给要签名的字符串的参数必须经过 URL 解码。从链接:
要构造共享访问签名的签名字符串,请首先从包含请求的字段构造要签名的字符串,然后将该字符串编码为 UTF-8 并使用 HMAC-SHA256 算法计算签名。请注意,待签名字符串中包含的字段必须经过 URL 解码。
请在字符串中使用未编码的参数值进行签名,这应该可以解决问题。
| 归档时间: |
|
| 查看次数: |
8514 次 |
| 最近记录: |