我正在构建一个小型物联网平台。我有一个webapp从MongoDB读取数据。有一个工人从MQTT读取数据并将数据存储到mongo。

直到这里,一切都很好。

我希望能够将代理运送到任何设备,它可以是RaspberryPi或ArduinoYún等。代理应从MQTT代理读取数据或向MQTT代理发送数据。

用户需要先注册并在我的应用程序中添加设备,然后才能这样做。如何正确处理身份验证?
我可以允许任何人向mqtt添加内容吗?我是否要强制设备先通过应用程序上的HTTP进行身份验证,然后它们才能使用代理?

我要进行公钥还是令牌身份验证?我不明白,所以我要问你。

#1 楼

对于MQTT设备,不需要首先通过HTTP使用身份验证。 MQTT支持身份验证,该身份验证可以链接到ACL,以控制给定用户/设备可以发布/订阅的主题。身份验证可以是MQTT协议级别的用户/密码,也可以是基于传输级别的TLS证书。

大多数代理在ACL中都支持通配符(和变量替换,例如{username})主题,从而允许您构建主题结构可以创建只能由给定用户访问的主题树。

当用户注册新设备时,您可以让系统为该设备颁发用户名/密码/客户端ID或证书可以用来唯一地标识设备并将其附加到正确的ACL结构。

如果不了解将要传递的信息种类和种类,很难以更具体的方式回答。您打算使用的MQTT主题结构。

#2 楼

永远不要让“任何人”通过MQTT向数据库中添加内容;)一旦不良数据进入数据库,分析程序的任何结果都将充其量,甚至更糟。每当您有来自“外部”的MQTT流量时,您都需要准备一些东西:DDoS保护,以便某人无法淹没您的数据库,主题验证...主题是否在“访问”列表中?和有效载荷验证...应该将这3,000字节的有效载荷允许进入通常会看到50字节有效载荷的我的MQTT Broker中吗?

由于用户必须在发送第一个MQTT数据包之前注册设备,因此可以使用令牌+ SSL之类的方式进行身份验证和加密。当您的客户端软件与MQTT代理连接时,您的客户端软件会要求令牌及其作为用户名或密码发送,并且由于您是提前生成的,因此代理可以快速查找以确保其有效并已分配给该代理。

#3 楼

如果您不想自己打扰经纪人并在其中嵌入任何身份验证方案,那么我可以为您提供解决方案(非商业性,例如,它是免费的):

您需要小型IoT平台的每个实例拥有单独的flespi.io帐户(我们称为客户)。您的平台将在配置中具有一个flespi超级令牌(用于访问flespi.io),并且能够通过使用MQTT或HTTP API创建受限制的令牌。在注册或激活期间,每台设备都会向您发出带有指定ACL的令牌,该令牌将子/发布访问限制为仅对指定主题。

设备使用令牌对MQTT代理进行身份验证(请参阅页面的中间)。

在该方案中,您可以侦听来自设备的所有已发布消息,并自动在数据库中创建条目,以确保它们来自经过身份验证的(真实)设备。