Перейти к содержимому

Keycloak

Документ отвечает на один вопрос: как сделать, чтобы сотрудник со страницы входа Keycloak попадал в портал смены пароля и не вводил логин второй раз.

Keycloak в такой схеме — точка входа в приложения, а не в портал паролей. Сценарий «забыл пароль» им закрыть нельзя по построению: чтобы пройти аутентификацию в Keycloak, нужен пароль, которого у человека как раз и нет. Поэтому портал остаётся отдельным адресом, доступным без входа, а Keycloak только приводит на него человека.

Сам пароль всегда меняется в каталоге. Keycloak с LDAP-федерацией видит те же учётные записи; отдельных паролей на его стороне при связке с AD нет, синхронизировать нечего.

В теме входа (login.ftl) добавляется ссылка на портал. Логин, если человек уже начал его вводить, передаётся параметром — портал подставит его в форму:

<a href="https://passwords.example.ru/change?username=${(login.username!'')?url}">
Сменить пароль
</a>
<a href="https://passwords.example.ru/reset?username=${(login.username!'')?url}">
Забыли пароль?
</a>

Портал принимает логин под тремя именами: login, username и login_hint. Последнее — стандартный параметр OIDC, и если приложение уже знает пользователя, ссылка может выглядеть так: /change?login_hint=ivanov@corp.example.ru. Доменная часть UPN отбрасывается, в форму попадает sAMAccountName.

Значение проверяется: принимаются только символы имени учётной записи и не длиннее 64 знаков, иначе поле остаётся пустым. Ссылка не может положить в форму произвольный текст, и подставленный логин ничего не подтверждает — он лишь избавляет от повторного ввода.

  • Федерация с AD. LDAP-провайдер типа Active Directory, режим READ_ONLY достаточен: пароли меняет портал, Keycloak их не пишет.
  • Кэш учётных записей. После смены пароля Keycloak продолжит принимать старый до истечения своего кэша; при READ_ONLY и Import Users: off этого не происходит.
  • Ссылка «Забыли пароль?» самого Keycloak (Forgot password в Realm settings) отправляет письмо со ссылкой на смену пароля в Keycloak. При связке с AD в режиме только на чтение её нужно выключить — иначе сотрудник получит форму, которая ничего не изменит в каталоге.

Возврата в Keycloak после смены пароля (redirect_uri, return_to) портал не поддерживает намеренно: параметр возврата на странице, доступной без аутентификации, — это открытый редирект, и закрывать его пришлось бы белым списком адресов. Если такой сценарий понадобится, он делается списком разрешённых адресов в конфигурации; по умолчанию портал заканчивает работу своей страницей «Готово».

Входа администратора через Keycloak (OIDC) тоже нет: интерфейс администратора аутентифицирует по каталогу и требует второй фактор. Если единая точка входа нужна и для него, это отдельная задача.