首页 > 解决方案 > 阅读所有注册 azure notification hub python

问题描述

我正在尝试检索在 azure 通知中注册的所有设备的列表,但我不断收到相同的错误 [“ 401MissingAudience:提供的令牌未指定 'Audience'..TrackingId:38d0f9f4-9836-498”、“2-a1d9- 60f5ceed7210_G7,时间戳:2019 年 1 月 28 日下午 3:59:33"]

domain = "https://mnamespace1.servicebus.windows.net"
    url = domain + "/notificationhub/registrations/?api-version=2017-11"
    r = requests.get(url, headers = {
        # "Content-Type": "application/atom+xml;type=entry;charset=utf-8",
        "authorization": 'WRAP access_token ="QeXuRZO2ATZM8jolXFYPDvQb4zWSzifmWvpS8eb5FLM="',
        "x-ms-version": "2017-11"})
    print (Response(r))

标签: azurepush-notification

解决方案


根据您的错误信息和代码,该问题是由于不正确地生成 sas 令牌引起的。

根据 REST API 的描述,Read All Registrations该 api 的正确 sas 令牌应该如下所示,请参阅章节Create SAS Security Token以了解如何生成。

SharedAccessSignature sr=https%3A%2F%2F<your servicebus name>.servicebus.windows.net%2F<your notification hub name>&sig=<signature with urlencode>&se=<expires>&skn=<police name, such as DefaultFullSharedAccessSignature>

上面的 SAS token 和 EventHub 是一样的,所以 EventHub 可以参考 Python 中的示例代码来生成,Notification Hub 的写法请参考Generate SAS tokenPython 。

这是我的示例代码。

import time
from urllib import parse
import hmac
import hashlib
import base64

def generate_sas_token(uri, sas_name, sas_value):
    target_uri = parse.quote_plus(uri)
    sas = sas_value.encode('utf-8')
    expiry = str(int(time.time() + 10000))
    string_to_sign = (target_uri + '\n' + expiry).encode('utf-8')
    signed_hmac_sha256 = hmac.HMAC(sas, string_to_sign, hashlib.sha256)
    signature = parse.quote(base64.b64encode(signed_hmac_sha256.digest()))
    return 'SharedAccessSignature sr={}&sig={}&se={}&skn={}' \
                     .format(target_uri, signature, expiry, sas_name)

api_version = '2017-11'
uri = 'https://<your servicebus name>.servicebus.windows.net/<your notificationhub name>/registrations/?api-version={}'.format(api_version)
sas_name = '<SharedAccessKeyName>' # for example, DefaultFullSharedAccessSignature
sas_value = '<SharedAccessKey>'
sas_token = generate_sas_token(uri, sas_name, sas_token)

然后,您可以获得 REST API 的响应,如下所示。

import requests
headers = {
    'Authorization':sas_token,
    'x-ms-version':api_version
}
r = requests.get(uri, headers=headers)
print(r.text)

推荐阅读