azure - 阅读所有注册 azure notification hub python
问题描述
我正在尝试检索在 azure 通知中注册的所有设备的列表,但我不断收到相同的错误 [“ 401
MissingAudience:提供的令牌未指定 '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))
解决方案
根据您的错误信息和代码,该问题是由于不正确地生成 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 token
Python 。
这是我的示例代码。
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)
推荐阅读
- android - 当我在 Firebase 中更新数据时,为什么活动会重新启动?
- android - Android:RecyclerView stackfromEnd 被忽略
- android - ViewPager Fragment scenario where the Fragment need to handle on/off status
- android - 根据预期的视频分辨率计算压缩比特率
- inform7 - 如何进行“打字”命令?
- machine-learning - 为什么XLNet和Transformer-XL中的batch_size不是第一维而是第二维?
- python - What is time complexity of Python3's open() function?
- python - Matplotlib FuncAnimation 在使用 PyQT5 的窗口应用程序中不起作用
- haskell - 如何成功安装 eclipsefp 依赖项?(buildwrapper 和接穗浏览器)
- mapbox-gl-js - Getting error this._mapboxgl.Marker is not a constructor when using geocoder