我正在开发 FreeRADIUS 3.0.15 与 NodeJS 中的 API 服务器之间的集成,该服务器将处理记帐、授权和身份验证。所有这些都已记录在案(例如,这个仓库是一个非常有价值的起点)并且相对简单。
不过,我也想使用动态客户端模块,并让我的 API 服务器决定是否允许客户端。我找不到有关此内容的任何文档,除了此主题在 FreeRADIUS 邮件列表上,其中包含有关如何让远程 API 授权客户端的工作示例:
# /sites-available/dynamic-clients
server dynamic_clients {
authorize {
if ("%{rest: https://url?ipaddress='%{Packet-Src-IP-Address}'}") {
update control {
&FreeRADIUS-Client-IP-Address = "%{Packet-Src-IP-Address}"
&FreeRADIUS-Client-Shortname = "%{rest: https://url?ipaddress='%{Packet-Src-IP-Address}'&return=shortname}"
&FreeRADIUS-Client-Secret = "%{rest: https://url?ipaddress='%{Packet-Src-IP-Address}'}&return=secret"
}
}
ok
}
}
这是可行的,尽管存在一些问题:
- 是否可以只调用服务器一次来获取不同的属性?在上面引用的帖子中,其中一位作者建议“正确格式化你的回答“并链接到一些 API 文档,但老实说,我不明白它的意思。
是否可以发送带有 JSON 有效负载的 POST 请求?这并不重要,但在配置其余模块时很容易做到,只需声明一个部分即可:
# /mods-available/rest rest { # ... other sections authenticate { uri = "${..connect_uri}/radius/authenticate" method = 'post' body = 'json' data = '{ "username": "%{User-Name}", "password": "%{User-Password}" }' } ... other sections }
答案1
JSON 响应格式记录在raddb/mods-可用/休息。邮件列表中的链接最初链接到一个锚点,该锚点也显示相同的 JSON 响应格式,但这些格式已经过时了。
是的,您可以返回多个属性,使用不同的列表、运算符和值,但 REST 字符串扩展不会这样做,它只会将 API 服务器的响应转储为字符串。您需要直接调用 REST 模块。
是的,您可以通过调用
rlm_rest
模块来实现,正如您所说的那样。字符串扩展只是在您想要对服务器响应进行后处理时才有用。假设您有一个自定义 API,它没有以正确的格式返回 JSON blob,您可以获取其余扩展的输出,将其传递给 JSON 映射并以此方式提取数据...至少在 v4.0.x 中你可以,不在 v3.0.x 中。