如何使用AAD身份验证令牌消费Azure Event Hub事件
Azure Event Hub 使用AAD JWT令牌消费事件方案
结论:AAD签发的身份验证令牌完全支持Event Hub事件消费操作,你收到400错误和认证方式无关,是请求路径、方法不符合接口规范导致的。
现有请求的错误原因
- 你调用的
/${EventHub}/messages路径仅支持POST方法用于发布事件,直接对该路径发起GET请求本身就属于Event Hub不支持的操作,因此返回「请求的HTTP操作不被支持」的400报错,和使用AAD令牌还是SAS令牌鉴权没有关联。 - 你的判断方向正确:消费事件必须指定消费者组参数,除此之外还需要明确目标分区、消费起始位点,走专门的事件接收接口,不能直接复用发消息的路径。
正确实现方式
权限前置要求
用于获取AAD令牌的身份主体(服务主体、用户账号、托管标识等),需要提前分配对应Event Hub作用域的Azure Event Hubs Data Receiver内置角色,或者配置了Microsoft.EventHub/namespaces/eventhubs/consumegroups/partitions/events/read操作权限的自定义角色;令牌申请的目标受众和发事件时保持一致即可。
消费接口规则
- 消费事件的合法接口路径格式为:
https://${Hub-NameSpace}.servicebus.windows.net/${EventHub}/consumergroups/${ConsumerGroup}/partitions/${PartitionId}/events${ConsumerGroup}可填$Default使用默认消费者组,有自定义消费者组时替换为对应名称${PartitionId}需替换为要拉取消息的目标分区ID,Event Hub不支持直接对整个Event Hub实例拉取消息,必须指定具体分区
- 合法curl请求示例:
curl --location --request GET 'https://${Hub-NameSpace}.servicebus.windows.net/${EventHub}/consumergroups/$Default/partitions/0/events?timeout=60&api-version=2014-01' \ --header 'Authorization: Bearer ${AAD_TOKEN}' \ --header 'Accept: application/json'
- GET请求无请求体,不需要携带发布事件时用的
application/atom+xml类型Content-Type头 - 可通过URL参数指定消费起始位点:追加
&offset=@latest从分区最新位置开始消费,追加&enqueuedTime=${Unix时间戳(毫秒)}从指定入队时间的位置开始消费,不传位点参数默认从分区最早的消息开始拉取
补充说明
Event Hub的Runtime REST接口规则对AAD鉴权、SAS鉴权完全一致,不存在仅SAS支持的操作,只要权限配置符合要求,AAD令牌可覆盖所有事件发布、消费操作。注意不要和Service Bus消息队列的REST接口规则混淆,两者虽然共用服务域名后缀,但接口路径设计存在明显差异。
内容的提问来源于stack exchange,提问作者CJW
相关产品推荐
相关产品推荐

