为 Python 中的 Azure IoT 中心生成过期的 SAS 令牌

Generate SAS token with expiry for Azure IoT Hub in Python

我有一个 IoT 中心,其中包含各种设置了 SAS 身份验证的设备。从文档中,我了解如何使用 IoT 中心连接字符串连接到设备,但我想知道如何使用 SAS 令牌。

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)

我在 docs 中找到了这个函数,但我很难理解如何使用这个令牌。

问题

  1. 谁能举例说明如何使用此令牌连接到 IoT 中心 API?
  2. 如果我需要令牌过期,这是否意味着必须重新生成共享访问密钥?如果是这样,我可以通过编程方式执行此操作吗?

提前致谢:)

我有一些使用 paho-mqtt 连接到 Azure IoT 中心的经验。 SaS 令牌用作连接到 IoT 中心时的密码。阅读 connecting to Azure IoT Hub using paho-mqtt.

上的 Microsoft 文档

如果您使用的是 MQTT:如@PlaidMode 的回答所述,SAS 令牌可用作 MQTT client 中的密码值。链接文档还描述了需要哪些其他值。 如果您改用 HTTP,则相同的令牌是授权的值 header。

关于你的第二个问题,过期是必须的,没办法。但是,这个到期时间是没有限制的,你可以想做多久就做多久(是否应该是另一个问题)。密钥过期后,您需要创建一个新密钥。您可以使用问题中包含的相同代码来执行此操作。