我正在使用MQTT开发一个消息传递应用程序,因为多次失败而退出GCM .
我有一个服务器代理在线,一个客户端连接和订阅它,并接收订阅主题的消息 .
现在我正在考虑订阅什么以及要发送什么消息 . 我有一个用于GCM实现的服务器(用户ID,谷歌密钥);我想我不再那样了?我考虑过使用用户ID订阅代理,如果用户B想要向用户A发送消息,那么B会向A用户的ID主题发布消息......但是通过这种实现,任何人都可以“嗅探”订阅随机ID的会话 .
所以,我有一个有效的MQTT服务器和客户端,我不知道如何正确地将它们用于消息传递应用程序......
我可以考虑一下,但我怀疑这是一个已知解决方案的众所周知的问题......
非常感谢你!
1 回答
我认为解决方案的关键是选择合适的寻址方案和ACL配置 . 我将首先尝试总结要求:
用户A(接收方)应该能够看到来自任何人的所有消息
用户B(发件人)应该能够向任何人发送消息
假设您使用以下主题结构:
/messages/{targetUserId}
. 我们还假设为了集中精力,您可以根据凭证或证书识别代理方的用户 . 如果不是这样,请告诉我 .您可以在mosquitto中创建ACL规则,以允许带有targetUserId的用户从
/messages/{targetUserId}
主题中读取 . 有关规则定义格式的详细信息,请参阅mosquitto.conf documentation . 第一个要求将得到满足 .您需要另一个ACL规则,以允许每个人使用
/messages/#
地址写入主题 . 这将满足第二个要求 .因此,用户可以向任何人发送消息,但不允许订阅其他人的消息 .
但是,除非您有一组预定义的规则,否则为所有用户静态创建所有可能的规则可能都不实用 . 而是实现您自己的身份验证插件,并通过
auth_plugin
设置在mosquitto.conf
中进行配置 . 或者使用灵活的mosquitto-auth-plug . This blog post提供有关如何配置和使用它的基本详细信息 .