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