EMQX V5.9.1 http认证 响应报文的用户属性,在设备端如何获取到

EMQX V5.9.1 http认证 响应报文的用户属性,在设备端如何获取到

http服务端返回报文:

{
“result”: “allow”,
“is_superuser”: true,
“client_attrs”: {
“clientid”: “aaaa”,
“username”: “aaaa17412”,
“password”: “1036968239”
}
}

在控制台的客户端的“客户端属性->详情”中已经生效

日志追踪里的日志:
msg: authenticator_result, authenticator: password_based:http, payload_encode: text, result: Encoded(text)={ok,#{client_attrs => #{<<“clientid”>> => <<“mqttx_0d208d87”>>,<<“password”>> => <<“-1683260088”>>,<<“username”>> => <<“mqttx_0d208d8748620”>>},is_superuser => true}}, username: junli

MQTTX中的日志:
[aaaaa] Received packet: {“cmd”:“connack”,“retain”:false,“qos”:0,“dup”:false,“length”:22,“topic”:null,“payload”:null,“sessionPresent”:false,“reasonCode”:0,“properties”:{“receiveMaximum”:32,“maximumPacketSize”:1048576,“retainAvailable”:true,“sharedSubscriptionAvailable”:true,“subscriptionIdentifiersAvailable”:true,“topicAliasMaximum”:65535,“wildcardSubscriptionAvailable”:true}}
在 MQTTX中的日志 的 properties 节点中 没有看到 user_property 属性(client_attrs),是怎么回事?

设备端 怎么能获取到 http 返回报文中的 client_attrs 节点中的 用户属性?

看不到 user_property 是预期行为:在 EMQX v5.9.1 里,HTTP 认证返回的 client_attrs 是服务端会话属性,不会自动写进 CONNACK 的 MQTT 5 User Property。

你在控制台能看到“客户端属性”,说明认证链已经生效。
设备端不能直接从 CONNACK 读取 client_attrs。要让设备拿到这些值,可以改成这两种做法之一:

  1. 用规则引擎订阅 $events/auth/check_authn_complete,取 client_attrs 后再发布到设备专属主题(例如 attrs/${clientid},建议 retained)。

  2. 客户端自己在 CONNECT 的 User-Property 或业务 Topic 里携带并同步需要的数据。
    另外你现在把 password 放在 client_attrs 里不建议继续这么做,建议只保留 snroledevice_id 这类非敏感字段。
    可以先用下面 SQL 验证服务端是否拿到了属性:

SELECT clientid, username, reason_code, client_attrs
FROM "$events/auth/check_authn_complete"
WHERE reason_code = 'success'

按照设置,触发不了 主题消息,是哪里配置问题吗?

你这个规则触发不起来,先改 SQL 条件:$events/auth/check_authn_complete 里没有 auth_result ,要用 reason_code
改成:

SELECT
  clientid,
  username,
  reason_code,
  json_encode(client_attrs) AS attrs_json
FROM "$events/auth/check_authn_complete"
WHERE reason_code = 'success'

动作里这样配:

  • 主题:attrs/${clientid}
  • Payload:${attrs_json}
  • Retain:true

或者你直接把 where 去掉

如果还收不到,贴两块信息:规则命中/失败计数截图 + 规则

是用的函数不对,多谢多谢!