【问题标题】:Generate SaS Token using Python使用 Python 生成 SaS 令牌
【发布时间】:2020-09-08 19:59:22
【问题描述】:

所以我直接从 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))

【问题讨论】:

  • 您的问题解决了吗,有进展吗?

标签: python azure


【解决方案1】:

更新

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

建议的故障排除步骤:

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

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

  3. 如果成功,建议在portal上raise a support ticket查看原来的服务问题出现在哪里。如果失败了,你也可以问他们怎么办和官方建议。

隐私

key的值不是以primary key=开头的。

我在iothubowner 中找到了我的主键。并使用您喜欢官方推荐的测试代码。它对我有用。

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

在我的sn-ps代码中,*的部分是我在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即可。

【讨论】:

  • 所以我使用了他的代码,就像我的一样,它生成了一个 SaS 密钥。但是,当我尝试使用它发送数据时,我得到了相同的答案: >>> print(resp.content) b'{"Message":"ErrorCode:IotHubUnauthorizedAccess;Unauthorized","ExceptionMessage" :"跟踪 ID:8e40e92b617949519c2bcc904d855a80-G:3-TimeStamp:09/10/2020 13:27:20"}'
  • @AndrezaBorchardt 如果您按照我的步骤操作但仍然收到此错误消息,那么您的 IoT 服务的创建可能存在问题。您可以在门户网站上提出支持票。他们会帮助您并检查日志。
  • @AndrezaBorchardt 您的问题解决了吗?有进展吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-21
  • 2020-09-20
  • 2018-03-28
  • 1970-01-01
  • 2018-12-12
  • 2018-08-14
  • 2022-09-28
相关资源
最近更新 更多