如何扩展EMQX的clientInfo以在HTTP授权流程中获取更多字段
如何扩展EMQX的clientInfo以在HTTP授权流程中获取更多字段
嗨,我刚好有过类似的配置经验,你的需求完全是可以实现的!下面给你分场景讲具体的实现思路:
一、获取password字段到授权端点
EMQX的HTTP授权默认不会主动传递密码,但我们可以借助认证阶段的元数据传递来实现:
- 在你已配置的HTTP认证服务(处理客户端登录的接口)中,当验证通过后,返回的JSON响应里额外添加
metadata字段,把密码或其他需要的信息存入其中,示例响应如下:
{ "result": "allow", "metadata": { "password": "${password}", "custom_user_data": "any_value_you_need" } }
- 接着在EMQX的HTTP授权配置里,就可以通过
${client.metadata.password}这个变量来引用该字段,把它加入到发给.NET API的请求参数或请求体中。比如授权请求的body可以设置成:
{ "clientid": "${clientid}", "username": "${username}", "password": "${client.metadata.password}", "action": "${action}", "topic": "${topic}" }
二、获取发布请求的payload字段
要拿到publish操作的payload,我们需要自定义HTTP授权的请求模板,直接引用EMQX内置的上下文变量:
- 在EMQX的控制台(或配置文件)中找到HTTP授权的配置项,修改请求体(如果是POST请求),添加
${payload}变量。示例请求体如下:
{ "clientid": "${clientid}", "username": "${username}", "payload": "${payload}", "topic": "${topic}", "action": "${action}" }
- 注意:
${payload}仅在客户端执行**发布(publish)**操作时才有有效值,订阅(subscribe)操作时该变量为空,你的.NET API需要做好空值兼容处理。
三、更灵活的扩展方式(进阶)
如果需要获取更多EMQX内置上下文里的字段,你可以直接使用EMQX支持的所有授权上下文变量——只要是client.authorize钩子触发时能获取到的上下文数据,都可以通过${xxx}的形式加入到授权请求中。
如果以上方法还满足不了你的定制需求,也可以尝试基于EMQX的钩子机制开发简单的自定义插件(熟悉Erlang的话),在授权钩子中收集额外信息后再转发给你的.NET API,不过这个门槛相对高一些,一般前面的方法足够覆盖大部分场景了。
备注:内容来源于stack exchange,提问作者zango123




