Freeradius 3.0.17 rlm_rest анализирует ответ json

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

Проблема, с которой я столкнулся, заключается в том, что Формат ответа JSON (предоставленного Заказчиком REST API) отличается от формата по умолчанию rlm_rest (указанного в и т. д. / Raddb / с включенными модами / отдых).

Конфигурация моего виртуального сервера, как показано ниже:

Дефолт

authorize {
...
...
rest
if (ok) {
    update control {
        Auth-Type := 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 "код" "идентификатор" "avps"

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

Так что мне было интересно, есть ли способ

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

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

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
0
1 198
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В 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-адреса и передайте свой собственный большой двоичный объект JSON.

Выглядит отлично :) Однако сейчас наша команда использует rlm_rest. Основная причина в том, что в этом случае мы реализовали мультиинтерфейс curl для поддержки мультиплексирования HTTP / 2. Итак, я предполагаю, что json должен быть результатом rlm_rest. Есть ли способ передать результат rlm_rest в rlm_json?

peteeelol 22.11.2018 03:43

rest_api - это просто экземпляр rlm_rest. Используемое там расширение - это расширение модуля rlm_rest. Я думаю, что rlm_rest нормально поддерживает HTTP / 2. Может потребоваться дополнительная опция, переданная libcurl для включения конвейерной обработки, но это все.

Arran Cudbard-Bell 22.11.2018 11:04

Да, я только что это проверил. По крайней мере, в v4.0.x мы можем относительно легко добавить конвейерную обработку. Просто нужно настроить несколько параметров на многофункциональной ручке, и все готово.

Arran Cudbard-Bell 22.11.2018 16:32

Спасибо ... Теперь я заметил, что реализация rlm_rest изменилась с curl_easy на curl_multi_interface в FreeRADIUS 4.0.x. Это делает мультиплексирование HTTP / 2 относительно простым!

peteeelol 23.11.2018 04:48

Другой вопрос, как мне указать метод HTTP, если я собирался использовать "% {rest_api: REST_URI JSON_BODY"? Я заметил, что есть uri и body, но нет метода HTTP.

peteeelol 23.11.2018 04:56

и вуаля! - github.com/FreeRADIUS/freeradius-server/commit/…

Arran Cudbard-Bell 24.11.2018 18:45

Спасибо за щедрую помощь. Буду использовать!

peteeelol 25.11.2018 13:32

Для остальных XLAT я считаю, что вы можете использовать %{rest_api:HTTP_METHOD REST_URI JSON_BODY}.

Arran Cudbard-Bell 25.11.2018 18:09

Без проблем! Дайте мне знать, если что-то нужно настроить. Не могли бы вы принять ответ, если считаете его правильным :)

Arran Cudbard-Bell 25.11.2018 18:10

Другие вопросы по теме