freeradius 3.0.17 rlm_rest 解析 json 响应

freeradius 3.0.17 rlm_rest parsing json response

我正在尝试使用 rlm_rest.

根据 RESTful API(由客户提供)验证 RADIUS 请求

我面临的问题是 响应 JSON 格式(由客户提供的 REST API)不同于 rlm_rest 默认格式(在 etc/raddb/mods-enabled/rest 中表示)。

我的虚拟服务器配置如下:

默认

authorize {
...
...
rest
if (ok) {
    update control {
        Auth-Type := rest
        }
    }
}

mods-enabled/rest

authorize {
    uri = "https://3rd-party-API/auth"
    method = 'post'
    body = 'json'
    chunk = 0
    tls = ${..tls}
    data = '{
        "code": 1,
        "identifier": %I,
        "avps": {
            "User-Name": ["%{User-Name}"],
            "NAS-IP-Address": ["%{NAS-IP-Address}"],
            "Called-Station-Id": ["%{Called-Station-Id}"],
            "Calling-Station-Id": ["%{Calling-Station-Id}"],
            "NAS-Identifier": ["%{NAS-Identifier}"]
        }
    }'
}

结果

/sbin/radiusd-Xxx

HTTP 响应代码

200

JSON正文

{
    "code": "2",
    "identifier": "91",
    "avps": {
        "Customer-Attributes": "Hello"
        ...
        ...
        "Acct-Interim-Interval": "300"
    }
}

JSON结构与例子不同,xlat解析 "code" "identifier" "avps"

当然,xlat 找不到与字典匹配的属性,同时找不到 "avps" 并且不会深入挖掘。

所以我想知道有没有

  1. 定义要解析的 xlat 的响应 JSON 结构
  2. 在JSON ("avps") 中插入一个"is_json" 或"do_xlat" 标志,希望xlat 能深入挖掘
  3. 保存 JSON 并使用 exec/rlm_exec 解析(使用 JQ 或任何其他 bash/JSON 工具)

请告知是否有任何解决方法。谢谢!

在FreeRADIUS version 4中,有一个rlm_json模块,它实现了一个基于xpath(jpath)的自定义节点查询语言,它非常有限,只支持一些非常基本的查询(随意增强它通过 PR :) ).

下面是我从客户配置库中提取的示例。您可以在这里看到它从 JSON 文档的根级别提取两个键(externalID 和 macAddress)并将它们分配给几个自定义属性(Subscriber-ID 和 Provisioned-MAC)。

map json "%{rest_api:https://${modules.rest[rest_api].server}/admin/api/${modules.rest[rest_api].api_key}/external/getDeviceBySerialNumber?certificateSerialNumber=%{lpad:&TLS-Client-Cert-Serial 40 0}}" {
    &Subscriber-ID := '$.externalId'
    &Provisioned-MAC := '$.macAddress'
}

也可以修改 xlat 扩展以发送 HTTP 正文数据。只需在 URL 之后放置一个 space 并传递您的自定义 JSON blob。