目前场景是这样的:客户端发布或者订阅时,需要传递自定义的token,给第三方http应用鉴权,只有token正确,才返回allow,否则返回deny。这个token,该怎么传递,平台才能获取到呢?
目前接口中只能获取以下数据,token无法获取:
clientid:mqtt-tcp-6002-3gaP4g;
username:admin;
topic:/network/6002;
action:publish;
peerhost:192.144.212.239;
proto_name:mqtt;
mountpoint:;
retain:false;
qos:0;
token:${token};
header token:${token}
开启HTTP应用授权,每次发布消息,都要调用一次HTTP接口,会有性能瓶颈,怎么才能在发布mqtt消息的时候,只调用一次HTTP应用接口呢?
缓存已开启:
但是后台日志可以看出,每发布一次消息,都会调用一次http接口:
authz cache 是针对每一个 mqtt 客户端的。
如果一个客户端第一次请求,就会没有 cache,请求结束了就会有一个自己的 cache。但是如果来了第二个客户端,他自己还是没 cache,还是会请求一次。
你只用一个客户端试试就看得出来了。
这个只有mqtt-tcp-6002和mqtt-tcp-6003,两个客户端,但是每次发消息都会请求http授权接口。
把 action 和 topic 打印出来看看,
cache 的 key 是 publish/subscribe + topic 组合的。比如 publish a/1 和 publish a/2就会请求 2 次。
这个clientId action topic 都是一样的。
我试一了下,是可以的啊,你执行一下下面这个命令我看看是什么情况 。
./bin/emqx ctl conf show authorization
使用以下命令进入容器
docker exec -it <container_name> bash
然后 cd 到 emqx 目录执行命令