freeradius 3.0.17 rlm_rest парсинг ответа json - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь аутентифицировать RADIUS-запросы по RESTful API (предоставленному Заказчиком), используя rlm_rest.

Проблема, с которой я сталкиваюсь, заключается в том, что формат ответа JSON (REST API, предоставляемый Заказчиком), отличаетсяиз формата по умолчанию rlm_rest (указан в и т.д. / 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 Body

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

Структура JSON отличается от примера, и xlat parse "code" "identifier" "avps"

И, конечно, xlat не находит атрибутов, совпадающих со словарем,в то время как он не может найти «avps» и не будет копать глубже.

Поэтому мне было интересно, есть ли в любом случае

  1. Определить структуру JSON ответа для xlat на синтаксический анализ
  2. Вставьте флаг "is_json" или "do_xlat" в JSON ("avps"), и надеюсь, что xlat будетзатем копайте глубже
  3. Сохраните JSON и выполните синтаксический анализ с exec / rlm_exec (используя JQ или любой другой инструмент bash / JSON)

Пожалуйста, сообщите, есть ли обходной путь.Спасибо!

1 Ответ

0 голосов
/ 21 ноября 2018

В FreeRADIUS версии 4 есть модуль rlm_json, который реализует пользовательский язык запросов узлов на основе xpath (jpath), он чрезвычайно ограничен и поддерживает только некоторые очень простые запросы (не стесняйтесь улучшать его с помощью PR :)).

Ниже приведен пример, который я вытащил из своей библиотеки пользовательских конфигураций.Здесь вы видите, что он извлекает два ключа (externalID и macAddress) из корневого уровня документа JSON и назначает их нескольким настраиваемым атрибутам (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 и передайте свой пользовательский BLOB-объект.

...