Mosquitto 消息鉴权

2018-01-29 23:21:43 +08:00
 xrlin

Mosquitto 的 topic 的 subscribe、publish 可以通过 mosquitto-auth-plug 来进行鉴权,但是如何对客户端发送的信息进行过滤 /校验?现在消息格式是{"from": "clientA", "content": "Test"}, 如果这条消息是 clientB 经过伪造后发出的,那么在客户端便会认为这条消息是 clientA 发出的,同时也需要对消息内容的合法性进行校验,现在的想法是通过后端订阅一个 topic,获取到所有客户端消息,进行鉴权、过滤后再次分发,大概如下:

clientA  --->  publish --->  Topic/Shared/1/clientA  
                                        |  
              managerClient (对所有客户端 topic 进行监听)   
                                        |                    Topic/Shared/1/clientB
                			      后端鉴权 /过滤后分发 --> publish-> Topic/Shared/1/clientC
                                                             Topic/Shared/1/clientE

不知道有没有更好的方案 ?之前没有这方面的经验,还望赐教。

2699 次点击
所在节点    问与答
12 条回复
MeteorCat
2018-01-29 23:47:32 +08:00
sign token ?
MeteorCat
2018-01-29 23:55:00 +08:00
请求 managerClient 的时候对其申请个 time+后端 key+sign 记录标识该会话的 clientA+sign 并返回,之后 publish/subscribe 时候对其数据附带返回,通过排查 sign+clientA 存在保证唯一性,这样的?
blueskit
2018-01-30 04:23:52 +08:00
把 clienta 加到 route 中,对 route 鉴权。
xrlin
2018-01-30 10:04:53 +08:00
@blueskit mqtt 没有所谓的 route 概念吧,我想过将 client 的标识加入 topic 中,Topic/Shared/1/clientA 中的"1"就是 clientA 的 id,这样做只能做用户是否能推送的判断,并不能对消息做进一步处理,所以我引入了 managerClient,这个运行在服务器的 mqtt 客户端会接收这些信息做进一步分发。但总感觉这有违 mqtt 的简单性。
blueskit
2018-01-30 11:26:12 +08:00
topic,Route 基本都是一回事,在 mqtt、rabbitmq 等软件中术语不同,但概念类似。而权限插件基本都是基于路径匹配,登录用户身份等综合进行。几乎没有从负载中获取信息来鉴别权限的
xrlin
2018-01-30 12:43:16 +08:00
@blueskit 我也不想从负载中获取信息,有没有可能在客户端获知消息是从哪个客户端发过来的?比如群聊,大家订阅同一个 topic,但是你总要知道是谁发出的消息才能做分类展示。
xrlin
2018-01-30 19:31:18 +08:00
@MeteorCat 用户鉴权可以通过插件实现,但问题是不能对消息内容进行处理,比如 clientA 在 group1 中发送一条消息{"from": "clientB", "message": "hack"}, 这条消息应该是不合法的,因为消息里的 from 应该是 clientA,不能是 clientB。
MeteorCat
2018-01-30 23:12:02 +08:00
5 楼已经说明很清楚了,权限插件都需要生成唯一身份标识,大部分都是登录用户身份什么的,看你发的 json,要么从 header,要么从 cookie 下手发返回唯一标识
MeteorCat
2018-01-30 23:13:24 +08:00
还有一个问题就是鉴权之类的,永远都不要信任客户端传入的任何东西
xrlin
2018-01-31 09:33:29 +08:00
@MeteorCat 正是因为不能相信用户的输入,所以才想在中间加入一层对所有信息进行接收检验,看来也只有这种办法了。
simonJcl
2019-11-13 19:01:14 +08:00
你们最后用什么方案
xrlin
2019-12-01 05:14:47 +08:00
@simonJcl 客户端不直接与 mq 通信,通过后端服务鉴权中转。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/426949

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX