首页 > 解决方案 > 使用 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))

标签: pythonazure

解决方案


更新

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

建议的故障排除步骤:

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

  2. 使用相同的代码进行测试,可以和我的一样。

  3. 如果成功,建议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

在此处输入图像描述


推荐阅读