python - 使用 Python 生成 SaS 令牌
问题描述
所以我直接从 Azure ( https://docs.microsoft.com/pt-br/azure/iot-hub/iot-hub-devguide-security ) 获取 Python 代码来生成 SaS 令牌。我为我的应用程序进行了必要的调整,但是当我使用生成的令牌通过 POST 发送数据时,它返回以下消息:
"Message":"ErrorCode:IotHubUnauthorizedAccess;Unauthorized","ExceptionMessage":"Tracking ID:c8b0d18b771e465081aa9324293adf73-G:1-TimeStamp:09/08/2020 19:53:52"
我知道如何在 VS Code 中使用 Azure 工具生成令牌,但我希望将这一代合并到代码中。下面是我正在使用的代码。(当然,将设备 ID、Iot Hub 名称和密钥替换为 microsoft 门户上提供的内容。)
from base64 import b64encode, b64decode
from hashlib import sha256
from time import time
from urllib import parse
from hmac import HMAC
def generate_sas_token(uri, key, policy_name, expiry=3600):
ttl = time() + expiry
sign_key = "%s\n%d" % ((parse.quote_plus(uri)), int(ttl))
#print (sign_key)
signature = b64encode(HMAC(b64decode(key), sign_key.encode('utf-8'), sha256).digest())
rawtoken = {
'sr' : uri,
'sig': signature,
#'se' : str(int(ttl))
}
if policy_name is not None:
rawtoken['skn'] = policy_name
rawtoken['se'] = str(int(ttl))
return 'SharedAccessSignature ' + parse.urlencode(rawtoken)
resource_uri = IoTHubName + ".azure-devices.net" + "/" + "devices" + "/" + deviceID
policy_name = "iothubowner"
uri = resource_uri
key = "primary key="
expiry = 3600
policy= "iothubowner"
print (generate_sas_token(uri, key, policy, expiry))
解决方案
更新
按照教程,一步一步,我可以得到想要的结果。所以可以说,这项服务至少对我来说是可用的。
建议的故障排除步骤:
重新创建
iot
服务,选择不同的区域,创建时选择与当前不同的其他参数。使用相同的代码进行测试,可以和我的一样。
如果成功,建议
raise a support ticket
在门户上查看原来的服务问题出现在哪里。如果失败了,你也可以问他们怎么办和官方建议。
私人的
key 的值不以 开头primary key=
。
我在 中找到了我的主键iothubowner
。并使用您喜欢官方推荐的测试代码。这个对我有用。
您可以在屏幕截图中看到我的结果。
在我的snippets代码中,带有的部分*
是我在portal上操作的地方,其他代码没有修改。
from base64 import b64encode, b64decode
from hashlib import sha256
from time import time
from urllib import parse
from hmac import HMAC
def generate_sas_token(uri, key, policy_name, expiry=3600):
ttl = time() + expiry
sign_key = "%s\n%d" % ((parse.quote_plus(uri)), int(ttl))
#print sign_key
signature = b64encode(HMAC(b64decode(key), sign_key.encode('utf-8'), sha256).digest())
rawtoken = {
'sr' : uri,
'sig': signature,
'se' : str(int(ttl))
}
if policy_name is not None:
rawtoken['skn'] = policy_name
return 'SharedAccessSignature ' + parse.urlencode(rawtoken)
IoTHubName="pan****ub"
deviceID="test*****eid1"
resource_uri = IoTHubName + ".azure-devices.net" + "/" + "devices" + "/" + deviceID
policy_name = "iothubowner"
uri = resource_uri
key = "cPn4nuFMiN******J4/ojFtA9YV22OAc="
expiry = 3600
policy= "iothubowner"
print (generate_sas_token(uri, key, policy, expiry))
我在门户中的操作。
只需添加创建设备,并选择身份验证类型Symmetric key
。
推荐阅读
- reactive-programming - 使用项目反应器将验证纳入反应链
- html - 在 html 标签中声明多个类时的优先顺序
- sapui5 - 多输入令牌未显示
- amazon-web-services - AWS Elastic Beanstalk - 保护生产环境免受意外部署
- vue.js - Vue.js。如何从字符串(道具)制作函数?
- blazor - 如何防止 MarkupString 在 Blazor 中自动关闭标签
- html - ngModel 属性在我的子 html 组件中不起作用
- r - Thesisdown:加载 huxtable 包和创建表格时,编织到 PDF 失败
- visual-studio-code - 如何使用图标字体
- php - 如何为每一列显示一行?