V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
xrlin
V2EX  ›  问与答

Mosquitto 消息鉴权

  •  
  •   xrlin · 2018-01-29 23:21:43 +08:00 · 2838 次点击
    这是一个创建于 2490 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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-01-29 23:47:32 +08:00 via Android
    sign token ?
    MeteorCat
        2
    MeteorCat  
       2018-01-29 23:55:00 +08:00 via Android
    请求 managerClient 的时候对其申请个 time+后端 key+sign 记录标识该会话的 clientA+sign 并返回,之后 publish/subscribe 时候对其数据附带返回,通过排查 sign+clientA 存在保证唯一性,这样的?
    blueskit
        3
    blueskit  
       2018-01-30 04:23:52 +08:00 via Android
    把 clienta 加到 route 中,对 route 鉴权。
    xrlin
        4
    xrlin  
    OP
       2018-01-30 10:04:53 +08:00
    @blueskit mqtt 没有所谓的 route 概念吧,我想过将 client 的标识加入 topic 中,Topic/Shared/1/clientA 中的"1"就是 clientA 的 id,这样做只能做用户是否能推送的判断,并不能对消息做进一步处理,所以我引入了 managerClient,这个运行在服务器的 mqtt 客户端会接收这些信息做进一步分发。但总感觉这有违 mqtt 的简单性。
    blueskit
        5
    blueskit  
       2018-01-30 11:26:12 +08:00 via Android   ❤️ 1
    topic,Route 基本都是一回事,在 mqtt、rabbitmq 等软件中术语不同,但概念类似。而权限插件基本都是基于路径匹配,登录用户身份等综合进行。几乎没有从负载中获取信息来鉴别权限的
    xrlin
        6
    xrlin  
    OP
       2018-01-30 12:43:16 +08:00 via iPhone
    @blueskit 我也不想从负载中获取信息,有没有可能在客户端获知消息是从哪个客户端发过来的?比如群聊,大家订阅同一个 topic,但是你总要知道是谁发出的消息才能做分类展示。
    xrlin
        7
    xrlin  
    OP
       2018-01-30 19:31:18 +08:00
    @MeteorCat 用户鉴权可以通过插件实现,但问题是不能对消息内容进行处理,比如 clientA 在 group1 中发送一条消息{"from": "clientB", "message": "hack"}, 这条消息应该是不合法的,因为消息里的 from 应该是 clientA,不能是 clientB。
    MeteorCat
        8
    MeteorCat  
       2018-01-30 23:12:02 +08:00 via Android
    5 楼已经说明很清楚了,权限插件都需要生成唯一身份标识,大部分都是登录用户身份什么的,看你发的 json,要么从 header,要么从 cookie 下手发返回唯一标识
    MeteorCat
        9
    MeteorCat  
       2018-01-30 23:13:24 +08:00 via Android
    还有一个问题就是鉴权之类的,永远都不要信任客户端传入的任何东西
    xrlin
        10
    xrlin  
    OP
       2018-01-31 09:33:29 +08:00 via iPhone
    @MeteorCat 正是因为不能相信用户的输入,所以才想在中间加入一层对所有信息进行接收检验,看来也只有这种办法了。
    simonJcl
        11
    simonJcl  
       2019-11-13 19:01:14 +08:00
    你们最后用什么方案
    xrlin
        12
    xrlin  
    OP
       2019-12-01 05:14:47 +08:00 via Android
    @simonJcl 客户端不直接与 mq 通信,通过后端服务鉴权中转。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1344 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 17:40 · PVG 01:40 · LAX 09:40 · JFK 12:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.