Send Event 的 Azure 事件中心 REST API 文档指定 POST 的请求 URI 可以是:
https://{serviceNamespace}.servicebus.windows.net/{eventHubPath}/messages
或者:
https://{serviceNamespace}.servicebus.windows.net/{eventHubPath}/publishers/{deviceId}/messages
使用后一个 URI 模板(我们为发布者指定 deviceId
)的值(value)是什么?
最佳答案
TLDR:大规模发件人授权/识别。
发布商政策旨在实现强大的场景。让我解释一下。 我们有 2 个实体在这里发挥作用:
- 拥有 eventhub 的人(假设是设备制造商)。这个人有兴趣接收消息并处理它们并从中提取有趣的信息(例如 - 检测设备已准备好进行维修等)
- 发送者(比方说,(1) 人 - 制造设备并销售它们;他嵌入代码以定期将事件推送到云端;因此我们的 (2) 是将事件发送到 eventHub 的实际设备)。<
假设您有 100K 个此类设备 - 将遥测数据发送到 EventHub。比方说,在 EventHub 接收器上,您正在计算来自每个设备的消息数量(并使用它来启用关键场景 - 例如:根据使用情况对每个设备进行计费)。让我们看看这些 URI 如何发挥作用来实现此场景:
- 使用 Uri1 [https://{serviceNamespace}.servicebus.windows.net/{eventHubPath}/messages] - 能够发送到 EventHub - 他们将需要一个 AuthorizationToken。每个设备不可能维护 100k 个 SAS key (EventHub 最多支持 12 个 SAS key )。因此 (1) - 设备制造商为他的所有设备生成一个 token - 使用 GetSharedAccessSignature API & 将在消息中填充设备 ID。该 token 有权向 eventHub 发送任何消息。这种方法的缺点是,如果有一个 device2 发现你如何对它们计费 - 它可以简单地欺骗为 device1 - 通过填充不同的名称。如果一台设备被黑客攻击,他们将获得对整个事件中心的访问权限。总体而言,该设备的权限比所需的权限高得多,并且违反了 principle of least privilege .
- 如果您使用 Uri2 (https://{serviceNamespace}.servicebus.windows.net/{eventHubPath}/publishers/{deviceId}/messages) - 以便能够安全地发送到 EventHub -设备需要一个 AuthorizationToken。因此,设备制造商颁发特定于此 {deviceId} url 的 token (使用 GetPublisherSAS )。现在,设备只能访问该设备特定的资源 Uri,该设备可以使用 key 实现的唯一操作 - 是发送到其自己的 url。除此之外 - 如果设备制造商想要阻止该设备发送事件 - 它可以发出 revokePublisher - 从那时起该设备将被阻止。 这就是他们如何大规模(以 100k 为单位)管理每个发送者级别的安全性。
我选择设备制造商只是作为示例。此功能在许多场景中都非常方便 - 例如:拥有大约 500 台机器的大型云服务,将所有关键遥测事件写入 eventHubs,大型网站 - 执行每个客户的操作来自客户端脚本等..
哈! 斯雷
关于Azure 事件中心 REST API : Why specify the publisher in the URL when sending events?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35290685/