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

Keycloak / OIDC: на каком этапе отказал вход

К ответу ↓

Отделите проверку URI перенаправления, аутентификацию клиента и выдачу или обновление токена. Одинаковое сообщение приложения не устанавливает этап отказа или ошибку пароля пользователя.

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

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

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

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

Keycloak / OIDC: на каком этапе отказал вход

Отделите проверку URI перенаправления, аутентификацию клиента и выдачу или обновление токена. Одинаковое сообщение приложения не устанавливает этап отказа или ошибку пароля пользователя.

1. Установите роли и этап отказа

Зафиксируйте реальный релиз, realm, client и UTC-интервал. Установите, что Keycloak делает в этой связи: обслуживает приложение как OpenID Provider или обращается к внешнему IdP как брокер. Данная ветка разбирает приложение → authorization endpoint → token endpoint. Сохраните последнее подтверждённое действие и имя наблюдающей системы. Ответ браузера, журнал приложения и server user event изучаются как отдельные свидетельства. Не объединяйте их лишь по соседству времени; общий прокси-адрес и название клиента не задают уникальную попытку.

2. Различите три класса ошибок

Для invalid_redirect_uri сначала исследуйте authorization endpoint: в 26.8.1 checkRedirectUri записывает ошибку события и отклоняет неподходящий URI. invalid_client в ответе token endpoint означает отказ аутентификации клиента, например из-за неизвестного клиента или неподходящего метода. invalid_grant относится к grant/refresh token: возможны истечение, отзыв, иное redirect URI или принадлежность другому клиенту. Это не три синонима неверного пользовательского пароля. Укажите endpoint, grant_type и точный слой error до выбора дальнейшей ветки.

3. Проверьте redirect без изменения настроек

Сопоставьте URI из разрешённой копии запроса с зарегистрированными адресами клиента: схема, хост, порт, путь, регистр и фактические значения должны рассматриваться вместе с настройками proxy/hostname. На этом шаге фиксируется расхождение, а не добавляется широкая маска. Ошибка redirect может произойти до установленного пользователя. При невалидном redirect URI стандарт OIDC не допускает перенаправление браузера на него, поэтому отсутствие callback в приложении не означает пропажу серверного события. Исправление конфигурации и проверочный вход являются отдельной операцией владельца интеграции.

4. Прочитайте два независимых примера

LOGIN_ERROR в примере содержит клиент portal-demo и invalid_redirect_uri. Значение details.redirect_uri относится к проверяемой ветви authorization, а не к успешной выдаче токена. Второй пример — отдельное JSON-тело invalid_grant: оно не утверждает ни конкретный grant_type, ни последовательность с первым событием. Первое jq-выражение читает массив сохранённых Keycloak events; второе читает только JSON-тело OAuth-ответа. Не подавайте им HAR целиком или текстовый server log. Они предназначены для проверки уже полученной обезличенной копии и не отправляют запросов. Приведённые jq-фильтры сами не ограничивают время: используйте массив, заранее выгруженный за нужное UTC-окно, либо добавьте явное условие по time, учитывая миллисекунды Unix-времени. Не смешивайте записи разных периодов только из-за одинаковых realm и клиента.

5. Соберите подтверждения со стороны приложения

Для token endpoint сопоставьте тип клиента, выбранный способ аутентификации, realm и идентификатор клиента по разрешённым метаданным конфигурации. Для invalid_grant проверьте тип обмена, хронологию получения/использования grant, совпадение клиента и redirect URI; сохраните факт повторной обработки в журнале приложения, если он доступен. Не воспроизводите обмен сохранённым кодом и не включайте секреты в отчёт. Достоверный итог может ограничиться этапом и перечнем ещё не проверенных условий. Сообщение браузера само по себе не устанавливает, дошёл ли запрос до token endpoint.

6. Свяжите события, не подменяя identity

Сравните доступные realm/client, время, server event ID и контекст приложения; userId/sessionId используйте только при наличии и после проверки области. CODE_TO_TOKEN_ERROR и LOGIN_ERROR — разные типы; состав и сохранение зависят от конфигурации. Если Keycloak использует LDAP-федерацию, переход к LDAP 49 оправдан только фактическим сообщением LDAP-провайдера. Для изменения клиента или роли ищите admin events отдельно. Привязка к Windows 4625/Kerberos также требует доказанной интеграционной связи, а не предположения по одному и тому же имени пользователя.

7. Если данных недостаточно

Проверьте типы событий, Save events, срок хранения, нужный realm, страницы экспорта и путь доставки. Действующие настройки не доказывают историческую регистрацию. Отсутствие userId на раннем отказе является допустимым состоянием данных; ошибку чтения или доступа нельзя считать пустым журналом. Зафиксируйте отдельно, что отсутствует: HTTP-ответ нужного endpoint, событие Keycloak либо журнал приложения. Не меняйте проверки TLS/redirect/подписи ради диагностики. Сохранённый вывод о месте разрыва полезен даже тогда, когда первопричина требует сведений владельца клиента.

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

Исходное полеСмысл и ограничения
Источник / endpoint / grant_typeКонтекст расследования из исходного запроса/приложения; не собственные обязательные поля EventRepresentation.
type / errorТип и ошибка Keycloak user event, когда событие сохранено; протокольный error ответа token endpoint читается отдельно.
realmId / clientIdОбласть и клиент; имя realm в Admin API и realmId не тождественны.
time / idВ событии time — epoch milliseconds; id помогает различать записи. HTTP-время имеет отдельный источник и точность.
details.redirect_uriЗапрошенный URI в рассматриваемой проверке 26.8.1; потенциально чувствительные query-параметры удалять из учебной копии.
userId / sessionIdOptional: до аутентификации могут отсутствовать; не заполнять по похожей попытке.
HTTP status / error / error_descriptionHTTP-метаданные и OAuth JSON ответа; error_description необязателен, не равен серверному stacktrace.

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

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

Authorization endpoint: сокращённый LOGIN_ERROR

Фрагмент журнала. Подмножество EventRepresentation с вымышленными значениями. Ветка 26.8.1 подтверждена AuthorizationEndpoint и checkRedirectUri. Это событие Keycloak, а не HTTP-ответ браузеру; userId/sessionId намеренно отсутствуют.

{
  "id": "00000000-0000-4000-8000-000000000201",
  "time": 1793773200000,
  "type": "LOGIN_ERROR",
  "realmId": "00000000-0000-4000-8000-000000000001",
  "clientId": "portal-demo",
  "ipAddress": "192.0.2.25",
  "error": "invalid_redirect_uri",
  "details": {
    "redirect_uri": "https://portal.example.test/callback-new"
  }
}

Token endpoint: отдельное JSON-тело ошибки

Фрагмент журнала. Пример фрагмента стандартного OAuth error response. Endpoint и HTTP-статус сохраняются отдельно: сам JSON не содержит grant_type, пользователя или причины invalid_grant. Этот пример не продолжение показанного LOGIN_ERROR и не payload токена.

{
  "error": "invalid_grant"
}

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

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

jq 1.8 · локальный JSON-массив уже сохранённых EventRepresentation; входной файл keycloak-events.json, без сети; замените учебный realmId и clientId согласно экспорту

jq -c '.[] | select(.realmId == "00000000-0000-4000-8000-000000000001" and .type == "LOGIN_ERROR" and .clientId == "portal-demo" and .error == "invalid_redirect_uri") | {id,time,type,realmId,clientId,userId,sessionId,error,details}' keycloak-events.json

jq 1.8 · только JSON-тело уже сохранённого OAuth-ответа; HTTP-заголовки в этот файл не включаются

jq '{error,error_description,error_uri}' oidc-error-body.json

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

OAuth error, Keycloak event.error и ошибка приложения принадлежат разным слоям. LOGIN_ERROR не доказывает отказ пароля или наличие обращения к AD.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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