exhook的返回值问题

message ValuedResponse {

// The responded value type
// - contiune: Use the responded value and execute the next hook
// - ignore: Ignore the responded value
// - stop_and_return: Use the responded value and stop the chain executing
enum ResponsedType {

CONTINUE = 0;

IGNORE = 1;

STOP_AND_RETURN = 2;

}

ResponsedType type = 1;

oneof value {

// Boolean result, used on the 'client.authenticate', 'client.authorize' hooks
bool bool_result = 3;

// Message result, used on the 'message.*' hooks
Message message = 4;

}
}这是原始定义。但是我的grpc框架不支持oneof这种语法,刚好我的message接收和认证要分成2个微服务,于是我写了如下的定义message ValuedResponse {

ResponsedType type = 1;

// Boolean result, used on the ‘client.authenticate’, ‘client.authorize’ hooks
bool bool_result = 3;
}。使用这样的定义接入服务时候,当我认证成功返回ture时,一切正常。当我返回false时,出现了如下报错2023-12-07 17:41:05 2023-12-07T09:41:05.177607+00:00 [warning] msg: unknown_responsed_value, mfa: emqx_exhook_handler:merge_responsed_bool/2(447), peername: 172.18.0.1:37996, clientid: K601qHVCuq|securemode=3,signmethod=hmacsha1,timestamp=1701941991030, resp: #{type => ‘STOP_AND_RETURN’}。这个意思很明显无法识别返回值。为什么在返回false时无法识别返回值?有什么办法可以解决我的问题

还要一个问题,两个认证返回false时,客户端连接是无法通过,但是发布订阅是可以的。没有打开文件的认证和授权功能。并且exhook的失败处理是deny。按道理来说应该是无法订阅的,但是订阅和发布消息没有任何影响。并启动了文件的授权功能后,文件的规则也不起作用了。

emqx版本5.3.2

2023-12-07T09:41:05.177607+00:00 [warning] msg: unknown_responsed_value, mfa: emqx_exhook_handler:merge_responsed_bool/2(447), peername: 172.18.0.1:37996, clientid: K601qHVCuq|securemode=3,signmethod=hmacsha1,timestamp=1701941991030, resp: #{type => ‘STOP_AND_RETURN’}

返回的 Response 中只有 type 但是没有将 boolean 值 false 编码进去 v5.3.2-exhook_handler.erl

因为使用 oneof 后,至多 一个字段会被设置。设置其中一个字段会清除其它字段。所以以下两段 protobuf message 结构是完全不同的,你无法通过后者来设置 oneof { bool_result } 字段

message ValuedResponse {
  // The responded value type
  //  - contiune: Use the responded value and execute the next hook
  //  - ignore: Ignore the responded value
  //  - stop_and_return: Use the responded value and stop the chain executing
  enum ResponsedType {
    CONTINUE = 0;
    IGNORE = 1;
    STOP_AND_RETURN = 2;
  }
  ResponsedType type = 1;
  oneof value {
    // Boolean result, used on the 'client.authenticate', 'client.authorize' hooks
    bool bool_result = 3;
    // Message result, used on the 'message.*' hooks
    Message message = 4;
  }
}
message ValuedResponse {
  // The responded value type
  //  - contiune: Use the responded value and execute the next hook
  //  - ignore: Ignore the responded value
  //  - stop_and_return: Use the responded value and stop the chain executing
  enum ResponsedType {
    CONTINUE = 0;
    IGNORE = 1;
    STOP_AND_RETURN = 2;
  }
  ResponsedType type = 1;
  // Boolean result, used on the 'client.authenticate', 'client.authorize' hooks
  bool bool_result = 3
}

我现在的方式是,如果认证失败就返回IGNORE,没有报错信息了。因为只有exhook认证,mqtt连接目前是无法连接的,但是还是可以发布或者订阅,这是怎么回事

是否有启用其他的 认证/鉴权 功能?
例如:内置数据库认证/内置数据库鉴权 ?

ExHook 失败动作是指 请求失败后的备用动作
ignoredeny 均指某次 调用 (即 gRPC 请求) 失败后的备用动作。
这里返回了 resp: #{type => 'STOP_AND_RETURN'},说明调用没有失败。

此外,经过调查,ExHook 在这里对 IGNORE 的处理上有一些问题,预计会在 5.4.1 中修复。
感谢使用及反馈。

内置权限认证,我把默认的最后一行删了,理论上是不会通过认证的。不知道是不是你说的IGNORE的问题导致的。关于这个probuf的定义,oneof这种语法会修改吗,我目前用的是golang的go-zero框架,目前不支持oneof语法的代码生成。虽然有其他方案,但逻辑变得复杂了