阅读所有注册Azure通知中心python

时间:2019-01-28 16:07:32

标签: azure push-notification

am尝试检索在天蓝色通知中注册的所有设备的列表,但我一直收到相同的错误 [   “ 401 MissingAudience:提供的令牌未指定“ Audience”。TrackingId:38d0f9f4-9836-498”,   “ 2-a1d9-60f5ceed7210_G7,TimeStamp:1/28/2019 3:59:33 PM” ]

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

1 个答案:

答案 0 :(得分:1)

根据您的错误信息和代码,此问题是由于错误生成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令牌与EventHub相同,因此您可以参考Python的示例代码来生成EventHub,请参考Generate SAS token for Python编写Notification Hub。

这是我的示例代码。

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)