IBCOURSES / СПРАВОЧНИК ИБ

Keycloak: как разобрать LOGIN и LOGIN_ERROR в нужном realm

К ответу ↓

Сначала проверьте сохранение событий в нужном realm. LOGIN/LOGIN_ERROR описывают этап входа в IdP; ответ API, серверный обработчик событий (event listener) и административный аудит — разные источники.

Например
Материалов с пояснениями: 94 · Записей реестров: 11 678

Уточнить поиск

События и журналы

Найдено: 84
Инструкция по проверке

Keycloak: как разобрать LOGIN и LOGIN_ERROR в нужном realm

Сначала проверьте сохранение событий в нужном realm. LOGIN/LOGIN_ERROR описывают этап входа в IdP; ответ API, серверный обработчик событий (event listener) и административный аудит — разные источники.

Условия и выбор источника

Зафиксируйте установленный релиз Keycloak, realm, приложение и период. Источники latest меняются, поэтому приведённый маршрут требует сверки со своей версией. Для сохранённых пользовательских событий проверьте Save events, выбранные типы и Expiration в настройках realm. Отдельно установите, читаете ли вы Admin API, интерфейс Events или журнал event listener. Административные операции имеют собственный аудит и не заменяются LOGIN. Для рабочего поиска нужны уже предоставленные права чтения; эта инструкция не создаёт роли, не меняет настройки и не получает токен.

Как отобрать события

В интерфейсе выберите пользовательские события нужного realm и ограничьте интервал, тип и клиент. Эквивалентный GET-шаблон показан во вкладке запросов: путь использует имя realm, а не realmId из объекта. Он требует существующей разрешённой аутентификации; секреты в пример не включены. Учтите first/max и полноту страниц выдачи. Если работаете с локальным JSON-массивом API, примените отдельный jq-фильтр. Не используйте его без изменения для построчного server log: другой формат требует другого разбора.

Разбор примера

LOGIN_ERROR в примере относится к portal-demo в указанном realm и содержит invalid_user_credentials. Поля userId и sessionId отсутствуют намеренно: на раннем отказе пользователь или сессия ещё могут быть не установлены. Не заменяйте отсутствие пустой строкой или именем из соседней попытки. Сохраните type, time и доступный контекст; при преобразовании времени проверьте единицы и часы. В текущем исходнике EventBuilder time формируется в миллисекундах. Пример не позволяет отличить ошибку человека от автоматизированного обращения без других наблюдений.

Интерпретация

Разделяйте попытку входа, успешный вход в IdP, обмен кода на токен и действие внутри приложения. Даже LOGIN не подтверждает чтение конкретного документа или выполнение операции. Похожая последовательность событий не доказывает, что их инициировал один человек: учитывайте общие устройства, прокси и параллельные запросы. Для оценки ошибки важны тип, этап и контекст, а не только название. ipAddress необходимо сопоставить с конфигурацией прокси и доступными сетевыми журналами; само поле не гарантирует адрес конечного устройства.

Следующий шаг

Свяжите доступные realm/client/user/session и время с журналами приложения, а при внешнем провайдере — с upstream IdP. Выпишите отдельно подтверждённые переходы и разрывы цепочки. Для вопроса об изменении пользователя, клиента или роли перейдите к административному аудиту и проверьте операцию/ресурс/субъекта. Не смешивайте API EventRepresentation с текстовым сообщением listener: у них разная форма и условия доставки. Поиск в справочнике объясняет поля, но не подтверждает настройку MFA или фактическое использование токена в вашей системе.

Если записи нет

Проверьте realm, границы времени, страницы API, тип события, сохранение и срок хранения. Затем разделите отсутствие в event store и отсутствие в server log: listener и хранилище событий имеют отдельные механизмы. Ошибка 403 говорит о доступе, а не о нулевом числе событий. При пустом userId сначала исследуйте доступный контекст, не назначая пользователя по похожему имени. Сравните исходный ответ с индексом назначения и ошибками доставки. Пустая выдача не исключает вход, если нужный тип не сохранялся или данные уже истекли.

Поля и область применения

Исходное полеСмысл и ограничения
id / timeID события и время, когда присутствуют. В текущей реализации time — миллисекунды epoch.
typeНапример LOGIN или LOGIN_ERROR; не смешивать с административной операцией.
realmIdID realm в записи; в пути Admin API используется имя realm.
clientIdКлиент входа, когда определён; сохранять вместе с realm.
userIdID пользователя при наличии; на раннем отказе может быть не определён.
sessionIdСвязь с сессией, когда она доступна; отсутствие не заполнять догадкой.
ipAddressНаблюдавшийся адрес; прокси и формат его данных проверять отдельно.
error / detailsОшибка и словарь деталей при наличии. Состав зависит от события и конфигурации.

Примеры записей

Данные в примерах условные. Состав полей зависит от версии и настроек источника.

Пример EventRepresentation: ошибка до установленного userId

Фрагмент журнала. Подмножество EventRepresentation с вымышленными значениями. userId и sessionId не добавлены: API помечает поля optional. Состав полей зависит от версии API.

{
  "id": "00000000-0000-4000-8000-000000000101",
  "time": 1793773200000,
  "type": "LOGIN_ERROR",
  "realmId": "00000000-0000-4000-8000-000000000001",
  "clientId": "portal-demo",
  "ipAddress": "192.0.2.25",
  "error": "invalid_user_credentials"
}

Команды и способы проверки

Укажите свой узел, путь к журналу и временной интервал. Требуемая среда указана рядом с командой.

Шаблон читающего Admin REST API latest. Выполнять только в разрешённом клиенте с существующей аутентификацией и правами чтения событий realm; токен не включён и запрос не отправлялся. Границы — весь 04.11.2026 в UTC, epoch milliseconds.

GET /admin/realms/demo/events?type=LOGIN_ERROR&client=portal-demo&dateFrom=1793750400000&dateTo=1793836799999&first=0&max=100

jq 1.8 · локальный JSON-массив уже полученных EventRepresentation; без обращения к Keycloak

jq -c '.[] | select(.type == "LOGIN_ERROR" and .clientId == "portal-demo") | {id,time,type,realmId,clientId,userId,sessionId,ipAddress,error}' keycloak-events.json

Первоисточники

Optional-поля могут отсутствовать. Событие входа в IdP не доказывает действие в приложении, личность человека или прохождение всех факторов.

Связанные материалы

Как пользоваться техническим справочником

Найдите порт, код ошибки, событие или источник журнала. Уточните протокол и систему, затем сверяйте значение, поля, примеры и первоисточники. Назначение порта не определяет фактическую службу, а одна запись не доказывает инцидент.

Материалы по разделам

События и журналы

Два ответа рядом

Сравнение источников

Сравнение показывает различия. События и поля разных систем не считаются эквивалентными.

Выберите службу

В списке — службы, доступные с текущими условиями. Число рядом — количество записей портов, а не программ на вашем узле.

Как искать в справочнике

Введите число, код, фрагмент сообщения или вопрос. Известный идентификатор поможет найти карточку; это не анализ самого инцидента.

  1. Введите номер, код, имя или фрагмент записи. Для портов можно использовать список: 80, 443, 8000–8010.
  2. Уточните поиск фильтрами. Все условия действуют одновременно. Числа в списках показывают, сколько материалов останется при выборе варианта.
  3. Службу выбирайте из каталога: поиск внутри списка помогает найти название, а кнопка «Выбрать» применяет его.
  4. Убирайте отдельные условия кнопкой × рядом с фильтром. «Сбросить фильтры» сохраняет текст поиска и текущий раздел.
  5. В карточке сверьте источник, версию и условия регистрации, затем откройте поля, примеры и первоисточник.

/ — перейти к поиску. Прямые ссылки открывают выбранную карточку в этом же справочнике.

Назначения портов и коды приведены по официальным реестрам. Версии, условия регистрации и ссылки на документацию указаны в карточках.

Избранное и недавние материалы хранятся в этом браузере. Запрос и фильтры сохраняются при возврате к выдаче и обновлении вкладки. Поиск работает локально.

Что есть в справочнике

От вопроса к свидетельствам: кто вошёл, что запустил, к каким данным обратился, что изменил и где искать следы.

Выберите область, чтобы посмотреть доступные источники и перейти к материалам.

Уточнить или исправить ответ

Скопируйте сообщение и отправьте его на mail@ibcourses.ru.