Этот документ проводит пользователя через процесс настройки клиента в Keycloak с ограниченными правами доступа, а затем тестирования вновь сконфигурированного клиента Keycloak путём настройки устройства AuP и запроса информации о регистрации указанного устройства через GraphQL с использованием учётных данных клиента.
Настройка клиента LK
Ниже пользователь будет пошагово проведён через процесс настройки нового клиента (в данном примере — lk) с ограниченными правами доступа; будет разрешено только чтение регистрационной информации устройства (DRI).
Портал Keycloak доступен по адресу https://<ip>/auth/, где <ip> — это IP-адрес экземпляра AuP, который необходимо настроить.
| Шаг | Описание | Изображение |
|---|---|---|
| 1 | Выберите область (realm) ecss | |
| 2 | Создайте клиента | |
| 2a | Создайте нового клиента — общие настройки | |
| 2b | Создайте нового клиента — настройка возможностей (capabilities config) | |
| 2c | Создайте нового клиента — настройки входа (login settings) | |
| 3 | Создайте политику клиента aup | |
| 3a | Выберите тип политики клиента aup | |
| 3b | Создайте политику клиента aup — конфигурация (config) | |
| 4 | Создайте разрешение клиента aup на основе области действия (scope-based permission) | |
| 4a | Создайте разрешение на основе области действия (scope-based permission) для клиента aup — конфигурация (config) (urn:aup:resources:device$ и urn:aup:scopes:device:show:device_registration_info) |
Запрос QR-кода устройства
После настройки клиента и устройства для выполнения запросов теперь можно убедиться, что конфигурация клиента выполнена правильно, попытавшись запросить DRI устройства, используя адрес электронной почты владельца устройства, указанный ранее.
Обратите внимание, что может быть удобно заранее задать следующие переменные окружения:
export IP= \
CLIENT_ID= \
CLIENT_SECRET=Идентификатор клиента (client id) и секрет клиента (client secret) можно найти, перейдя в список клиентов по адресу https://<ip>/auth/admin/master/console/#/ecss/clients/ и щёлкнув на клиенте, созданном на предыдущих шагах.
Перейдите на вкладку Credentials и нажмите на значок «глаз», чтобы показать секрет клиента. Идентификатор клиента соответствует имени выбранного вами клиента.
При выполнении приведённых ниже шагов рекомендуется также задать следующие переменные окружения, используя соответствующие значения из ответов curl:
export TICKET= \
CLIENT_JWT= \
CLIENT_RPT=| Шаг | Запрос | cURL-запрос | Ответ |
|---|---|---|---|
| 1 | Initial GraphQL for ticket (Начальный запрос GraphQL для тикета) | curl --insecure --request POST --url $IP:1080/api/graphql/v1 --header 'Content-Type: application/json' --data-raw '{"query": "query {drisGet(objects: [{userEmail: \"test_qr@eltex.loc\"}]) {deviceUuid drPayload drQrBinary drQrUrl driType}}"}' | { "data": { "WWW-Authenticate": { "as_uri": "https://<ip>/auth/realms/ecss", "realm": "ecss", "ticket": "<ticket>", "type": "UMA" } }, "errors": [ {"message": "Unauthorized"} ]} |
| 2 | Getting client JWT (Получение JWT-клиента) | curl --insecure --request POST --url https://$IP/auth/realms/ecss/protocol/openid-connect/token --header 'Content-Type: application/x-www-form-urlencoded' --data client_id=$CLIENT_ID --data client_secret=$CLIENT_SECRET --data grant_type=client_credentials | {"access_token": "<client_jwt>", "expires_in": 1800, "refresh_expires_in": 0,"token_type": "Bearer","not-before-policy": 0,"scope": "email profile"} |
| 3 | Getting RPT for authorizing ticket using client JWT and ticket (получение RPT для авторизации тикета с использованием JWT-клиента и тикета) | curl --insecure --request POST --url https://$IP/auth/realms/ecss/protocol/openid-connect/token --header "Authorization: Bearer $CLIENT_JWT" --header 'Content-Type: application/x-www-form-urlencoded' --data ticket=$TICKET --data grant_type=urn:ietf:params:oauth:grant-type:uma-ticket | {"upgraded": false,"access_token": "<client_rpt>","expires_in": 1800,"refresh_expires_in": 0,"token_type": "Bearer","not-before-policy": 0} |
| 4 | Authorizing initial GraphQL query (авторизация начального запроса GraphQL) | curl --insecure --request POST --url $IP:1080/api/graphql/v1 --header 'Content-Type: application/json' --header "Authorization: Bearer $CLIENT_RPT" --data-raw '{"query": "query {drisGet(objects: [{userEmail: \"test_qr@eltex.loc\"}]) {deviceUuid drPayload drQrBinary drQrUrl driType}}"}' | {"data": {"drisGet": [{"deviceUuid": "<uuid>","drPayload": "<elph_connection_string>","drQrBinary": "<qr_base64_binary | null>","drQrUrl": "<qr_url>","driType": "ELTEX_IP_PHONE"}]}} |
Давайте внимательнее рассмотрим окончательный ответ в цепочке, который содержит QR-код устройства, среди прочего, проанализировав приведённый ниже пример:
{
"data": {
"drisGet": [
{
"deviceUuid": "0ea3ce70-1e58-43f9-b82b-f8528f9b12db",
"drPayload": "http://org.eltex.android.app.ip_phone?dri=eyJhdXBfYmFzZV91cmwiOiIxMC4xNzIuMzMuNDIiLCJjZmdfZmlsZW5hbWUiOiJjb25maWcuY2ZnIiwiZGV2X2lkIjoiZWU1N2Y1NTc2MTM3NGQ0OGJiODk2MDU2MTQwY2UyNmQiLCJkcnQiOiIxMDc3YWI3OS03Zjg3LTQ0MzAtOGFiMC00MDVlOGYxYWFhNTMiLCJsb2dpbl9oaW50IjoidmlydHVhbF91c2VyIn0=",
"drQrBinary": "<base64_png_binary>",
"drQrUrl": "http://minio:9000/ecss-autoprovision/uploads/devices/dri/qr_codes/986dceecb091473493645ab86ada8337.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20250922%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20250922T092939Z&X-Amz-Expires=300&X-Amz-SignedHeaders=host&X-Amz-Signature=23e3c62e4b518023b079e174fa5d5101dbec3cbaf9a18d08f02e6e20bc00bbb7",
"driType": "ELTEX_IP_PHONE"
}
]
}
}
Поля deviceUuid и driType будут проигнорированы, так как они не относятся к QR-коду или Elph, остальные поля ответа следующие:
drPayload — строка подключения пользователя, используется при работе с настольным клиентом Elph;
drQrBinary — бинарное представление PNG-кода QR, закодированное в Base64. Используется при подключении с мобильного клиента Elph — применяется для встраивания изображения QR-кода в клиентские приложения;
В версии AuP 2.12 это поле равно
null, если AuP не запущен сECSS_CORE_QR_ON_THE_FLY=true(например:export ECSS_CORE_QR_ON_THE_FLY=true).drQrUrl — URL для PNG-изображения QR-кода — используется конечным пользователем для подключения мобильного клиента Elph. УСТАРЕВШЕЕ: это свойство будет удалено в будущих версиях AuP (в версиях после 2.12).
