Azure 事件中心:如何将 SAS 令牌授予 Javascript 发布者(在浏览器中为 运行)?

Azure Event Hubs: How to grant SAS tokens to Javascript publishers (running in browser)?

我正在构建一个基于 Azure 事件中心的网站分析解决方案。我在每个网页中嵌入了 Javascript 代码,通过 Azure Event Hubs REST API.

将事件直接发布到事件中心

REST API 要求每个调用都通过 SAS 令牌进行身份验证。我的问题是 - 我是否必须编写一个服务器端端点,以便在我的发布者开始发布之前为其提供临时令牌?

是否有替代方法?

  1. REST API 是否提供开箱即用的 "authenticate" 端点? (没找到here
  2. 或者,多么可怕,安全明智将令牌硬编码到客户端代码中会怎样?
  3. 或者,技术上可行但安全性比选项 2 差得多,在客户端代码中硬编码事件中心的共享访问密钥并使用类似 (非官方)Azure ServiceBus JavaScript SDK to generate SAS 令牌?

事件中心 REST api 不提供身份验证端点。您将必须在服务器端为每个客户端(浏览器或设备)生成 SAS 令牌(可能是 AuthN/Z 例程的一部分?)。请参阅 IoT 上的 RedDog.ServiceBus nuget package to generate SAS tokens for your Event Hub, per client. Also this article,解释了使用上述包对事件中心进行身份验证。

在我看来,我更愿意做上面的事情并排除#2 和#3。他们(2 和 3)使解决方案容易受到攻击并违反最佳实践。

考虑到 Google Analytics 和其他浏览器分析提供商设置的示例,我的问题中的第二种选择是完全可以接受的。

也就是说,SAS 令牌可以在“每个站点”(或“每个分析客户”)的基础上生成,并由跟踪该站点的所有浏览器共享。密钥的生成可以通过像 Sandrino Di Mattia 的 Event Hubs Signature Generator based on his RedDog Azure 库这样的工具来完成。

这种方式可以在发布者入职时生成一次令牌,并且不需要在线 Web API 端点始终可用。

作为替代方法,您可以考虑使用 Application Insights 进行事件摄取。根据您正在执行的事件收集类型,您可以使用它并使用内置存档机制导出数据或不时查询特定事件的端点。 App Insights 专为浏览器内的 JS 场景而设计,可以处理大量 RPS + 你可以获得一些报告、分析、查询端点和其他一些有趣的功能。它提供了您可以使用的 SDK 和 JS 库,并使用浏览器的本地存储为您实现批处理。

附带说明一下,将浏览器(以及上面的任何其他 JS 代码 运行)视为不安全的客户端。这意味着,即使您编写了一种机制来向您编写的服务器端应用程序发出请求以获取 SAS 密钥,任何开发人员都能够在内存中进行拦截。因此,您可以做的最安全的事情是 a) 有一个生成短期 SAS 密钥的服务器端代码,以及 b) 让您的客户端在调用此服务器端代码之前进行身份验证。或者,忽略该问题并过滤您收到的无效事件。

GA 和 App Insights 都通过公开一个公共密钥来工作。据我所知,Google Analytics 使用试探法来过滤无效请求。我想 App Insights 也是如此。