【问题标题】:Is it possible to use Azure Shared Access Signature outside of Azure?是否可以在 Azure 之外使用 Azure 共享访问签名?
【发布时间】:2020-12-29 12:49:52
【问题描述】:
由于 Azures Shared Access Signatures (SAS) 是一个开放标准,我想在我的 Django 应用程序中使用它,它与 Azure 没有任何链接。我基本上想创建一段代码,在接下来的 24 小时内对我正在服务的特定 url 创建读取权限。所以我看了一些关于 SAS 的视频,并为它安装了 python 库 (pip install azure-storage-blob)。
我阅读了README here on github,但据我所知,它始终需要一个 Azure 帐户。是否也可以在我自己的(Python)应用程序中使用 SAS?我想它会根据预定义的密钥创建散列。如果这是可能的,是否有人有任何关于如何创建 url 以及如何验证它的示例代码?最好使用 Python,但也欢迎使用其他语言的示例代码。
【问题讨论】:
标签:
python
django
azure
shared-access-signatures
【解决方案1】:
虽然存在 here 的原始 blob 存储 sas 生成代码,但我宁愿发现以下简化代码对您的一般用途更有用(受 this sample 启发)。 根据您的需要进行调整。下面是使用密钥的客户端 sas 生成逻辑(hmac sha256 摘要)。在服务器端使用类似的逻辑重新生成签名提取 URL 参数 (sr, sig, se) 并将相同的 (sig) 与从客户端传递的参数进行比较以匹配。请注意,客户端和服务器端的共享密钥是这里的主要驱动程序。
import time
import urllib
import hmac
import hashlib
import base64
def get_auth_token(url_base, resource, sas_name, sas_secret):
"""
Returns an authorization token dictionary
for making calls to Event Hubs REST API.
"""
uri = urllib.parse.quote_plus("https://{}.something.com/{}" \
.format(url_base, resource))
sas = sas_secret.encode('utf-8')
expiry = str(int(time.time() + 10000))
string_to_sign = (uri + '\n' + expiry).encode('utf-8')
signed_hmac_sha256 = hmac.HMAC(sas, string_to_sign, hashlib.sha256)
signature = urllib.parse.quote(base64.b64encode(signed_hmac_sha256.digest()))
return {"url_base": url_base,
"resource": resource,
"token":'SharedAccessSignature sr={}&sig={}&se={}&skn={}' \
.format(uri, signature, expiry, sas_name)
}