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" 并且不会深入挖掘。
所以我想知道有没有
- 定义要解析的 xlat 的响应 JSON 结构
- 在JSON ("avps") 中插入一个"is_json" 或"do_xlat" 标志,希望xlat 能深入挖掘
- 保存 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。
我正在尝试使用 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" 并且不会深入挖掘。
所以我想知道有没有
- 定义要解析的 xlat 的响应 JSON 结构
- 在JSON ("avps") 中插入一个"is_json" 或"do_xlat" 标志,希望xlat 能深入挖掘
- 保存 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。