使用Python生成SaS令牌

2024-09-30 06:17:39 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我直接从Azure(https://docs.microsoft.com/pt-br/azure/iot-hub/iot-hub-devguide-security)获取了一个Python代码来生成SaS令牌。我对我的应用程序进行了必要的修改,但当我使用生成的令牌通过POST发送数据时,它会返回以下消息:

“消息”:“错误代码:IoTubUnauthorizedAccess;Unauthorized”,“例外消息”:“跟踪ID:c8b0d18b771e465081aa9324293adf73-G:1-时间戳:09/08/2020 19:53:52”

我知道如何在VS代码中使用Azure工具生成令牌,但我希望这一代能够包含在代码中。下面是我正在使用的代码。(当然,将设备ID、Iot集线器名称和密钥替换为microsoft 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

    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))

Tags: key代码namefromimport消息timeparse
1条回答
网友
1楼 · 发布于 2024-09-30 06:17:39

更新

按照教程,一步一步,我可以得到想要的结果。所以可以说,这项服务至少对我是可用的

建议的故障排除步骤:

  1. 重新创建iot服务,选择不同的区域,并在创建时选择与当前区域不同的其他参数

  2. 使用与我相同的代码进行测试

  3. 如果成功,建议在门户上raise a support ticket检查原始服务问题发生的位置。如果失败了,你也可以问他们该怎么做和官方建议

私密的

键的值不能以primary key=开头

我在^{中找到了我的主键。并使用您的测试代码,如官方推荐。它对我有用

enter image description here

你可以在截图中看到我的结果

enter image description here

在我的代码片段中,带有*的部分是我在门户上操作的地方,其他代码没有被修改

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

enter image description here

相关问题 更多 >

    热门问题