基于 HTTP 应用进行授权,怎么在请求头或者请求体中,加上自定义参数token ?

目前场景是这样的:客户端发布或者订阅时,需要传递自定义的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}

目前我们只支持这几个占位符。
https://github.com/emqx/emqx/blob/master/apps/emqx_auth_http/src/emqx_authz_http.erl#L41-L56

你可以把 username 用起来,直接用他来填 token。
或者你直接把 token 拼在 username 后面 admin: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安装的,怎么执行这个命令?

解决没有

使用以下命令进入容器

docker exec -it <container_name> bash

然后 cd 到 emqx 目录执行命令
image

qos 不同也会再请求一次。