Mosquitto 消息鉴权 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xrlin
V2EX    问与答

Mosquitto 消息鉴权

  •  
  •   xrlin 2018 年 1 月 29 日 3313 次点击
    这是一个创建于 2910 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 

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

    12 条回复    2019-12-01 05:14:47 +08:00
    MeteorCat
        1
    MeteorCat  
       2018 年 1 月 29 日 via Android
    sign token ?
    MeteorCat
        2
    MeteorCat  
       2018 年 1 月 29 日 via Android
    请求 managerClient 的时候对其申请个 time+后端 key+sign 记录标识该会话的 clientA+sign 并返回,之后 publish/subscribe 时候对其数据附带返回,通过排查 sign+clientA 存在保证唯一性,这样的?
    blueskit
        3
    blueskit  
       2018 年 1 月 30 日 via Android
    把 clienta 加到 route 中,对 route 鉴权。
    xrlin
        4
    xrlin  
    OP
       2018 年 1 月 30 日
    @blueskit mqtt 没有所谓的 route 概念吧,我想过将 client 的标识加入 topic 中,Topic/Shared/1/clientA 中的"1"就是 clientA 的 id,这样做只能做用户是否能推送的判断,并不能对消息做进一步处理,所以我引入了 managerClient,这个运行在服务器的 mqtt 客户端会接收这些信息做进一步分发。但总感觉这有违 mqtt 的简单性。
    blueskit
        5
    blueskit  
       2018 年 1 月 30 日 via Android   1
    topic,Route 基本都是一回事,在 mqtt、rabbitmq 等软件中术语不同,但概念类似。而权限插件基本都是基于路径匹配,登录用户身份等综合进行。几乎没有从负载中获取信息来鉴别权限的
    xrlin
        6
    xrlin  
    OP
       2018 年 1 月 30 日 via iPhone
    @blueskit 我也不想从负载中获取信息,有没有可能在客户端获知消息是从哪个客户端发过来的?比如群聊,大家订阅同一个 topic,但是你总要知道是谁发出的消息才能做分类展示。
    xrlin
        7
    xrlin  
    OP
       2018 年 1 月 30 日
    @MeteorCat 用户鉴权可以通过插件实现,但问题是不能对消息内容进行处理,比如 clientA 在 group1 中发送一条消息{"from": "clientB", "message": "hack"}, 这条消息应该是不合法的,因为消息里的 from 应该是 clientA,不能是 clientB。
    MeteorCat
        8
    MeteorCat  
       2018 年 1 月 30 日 via Android
    5 楼已经说明很清楚了,权限插件都需要生成唯一身份标识,大部分都是登录用户身份什么的,看你发的 json,要么从 header,要么从 cookie 下手发返回唯一标识
    MeteorCat
        9
    MeteorCat  
       2018 年 1 月 30 日 via Android
    还有一个问题就是鉴权之类的,永远都不要信任客户端传入的任何东西
    xrlin
        10
    xrlin  
    OP
       2018 年 1 月 31 日 via iPhone
    @MeteorCat 正是因为不能相信用户的输入,所以才想在中间加入一层对所有信息进行接收检验,看来也只有这种办法了。
    simonJcl
        11
    simonJcl  
       2019 年 11 月 13 日
    你们最后用什么方案
    xrlin
        12
    xrlin  
    OP
       2019 年 12 月 1 日 via Android
    @simonJcl 客户端不直接与 mq 通信,通过后端服务鉴权中转。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2869 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 13:40 PVG 21:40 LAX 05:40 JFK 08:40
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86