如何在不暴露凭据(用户名和密码)的情况下从 JavaScript 客户端 (React) 连接到 MQTT 代理

How to Connect to an MQTT Broker from a JavaScript Client (React) Without Exposing Credentials (username and password)

提问人:Luis Landázuri 提问时间:11/15/2023 更新时间:11/15/2023 访问量:53

问:

我正在尝试将我的 React 应用程序安全地连接到我的 Mosquitto MQTT 代理,而不会暴露我的用户名和密码,因为任何人都可以访问 js 代码并可以看到凭据。

到目前为止,我考虑的选项如下:

使用 mqtt.js 直接连接我的客户端会暴露我的用户名和密码。因此,我正在考虑构建一个 API,如果用户经过身份验证(比如说 JWT),它会返回我的凭据。但是,有人担心,如果有人获得对用户令牌的访问权限,他们将能够检索用户名和密码,从而降低此方法的安全性。

构建一个连接到 MQTT 代理的 API,将数据保存在 MongoDB 中,然后公开端点以访问数据。虽然这是我目前正在研究的,但它似乎从根本上存在缺陷,因为我最终可能会失去 MQTT 的许多有利功能。在这种情况下,可能值得考虑完全放弃 MQTT。

我想知道是否可以在后端添加用户名和密码并将 mqtt 连接返回给客户端,使用后端作为某种中间件来添加缺失的信息,前提是 jwt 有效。

我知道我可以使用MQTT的自定义插件来验证我的JWT令牌,但由于可能增加复杂性,我不倾向于此选项。构建和配置代理和插件可能会引入其他问题来源。

JavaScript ReactJS 后端 MQTT MOSQUITTO

评论

0赞 Sharp Dev 11/15/2023
不要在令牌中包含用户名和密码,然后...将该信息存储在服务器的其他位置。然后,您可以使用 jwt(甚至更好的是不透明令牌)来保持用户身份验证,而不会泄露您的用户/通行证。
0赞 possum 11/15/2023
只有您才能评估您的安全需求并权衡可接受的风险。要求陌生人为你做这件事是危险的。
0赞 Luis Landázuri 11/15/2023
@SharpDev 为了连接到 MQTT 代理,您需要提供用户名和密码,如果我不想暴露该用户名和密码,我基本上必须制作 API 并不断轮询服务器以获取数据(这是我唯一认为我能想到的)。我的问题是,是否可以在不暴露凭据(用户名、密码)的情况下连接到从浏览器中断的 MQTT。
0赞 Luis Landázuri 11/15/2023
@possum 我问的是如何从前端应用程序 (react) 安全地实现与 MQTT 代理的连接,而不暴露用户凭据,这里没有什么可评估的。
0赞 Justin Bertram 11/15/2023
您使用的是哪个版本的 MQTT?MQTT 5 引入了“增强身份验证”,它可能允许您在没有用户名和密码凭证的情况下使用数据包上的新属性以及与数据包的扩展握手进行身份验证。CONNECTAUTH

答:

0赞 possum 11/15/2023 #1

由于安全性似乎不是问题,并且只需要通过注释中的说明直接从 yoru 客户端连接到 mqtt 而不暴露用户凭据的方法,因此您可以通过在配置文件中设置(通常是 mosquitto.conf,取决于未指定的安装方法)完全在 mosquitto 中完全禁用用户名和密码的需求:

allow_anonymous true

一旦您消除了对凭据的需求,就没有什么可公开的了。

正如我在评论中所说,只有您可以评估您的安全需求。这是危险的,只是一个建议,因为原作者坚持在不考虑安全性的情况下找到一种方法。