#keycloak
#keycloak
Вопрос:
Я создал пользовательский IDP, и всякий раз, когда я вхожу в систему, мне нужно установить заметку о сеансе пользователя, которая отображается в Keycloak, а затем добавляется к токену доступа. Проблема, с которой я сталкиваюсь, заключается в том, что эта заметка о сеансе пользователя не сохраняется при первом входе пользователя в систему. Это работает во второй раз, и в третий, и так далее, но при первом входе в систему пользователь не просто получает ключ / значение, добавленное к токену.
Каждый раз вход выполняется успешно, однако в нем отсутствует заметка о сеансе пользователя, которую я хотел отобразить на токене.
Я не уверен, в чем проблема. IDP настроен на пользовательский «Первый поток входа», в котором есть создать пользователя, если он уникален (альтернатива), и автоматически установить существующего пользователя (альтернатива). Может быть, здесь есть что-то, что мне нужно изменить, чтобы оно также включало заметки о сеансе пользователя в токене для первого входа в систему?
Ответ №1:
Я обнаружил, что вам нужно реализовать importNewUser()
метод в вашем расширении AbstractIdentityProviderMapper
и установить свои заметки на authenticationSessionModel
там.
Внутри аутентифицированного метода, где вызывается preprocessFederatedIdentity()
, Keycloak проверяет, является ли federatedUser == null
. На данный момент вы находитесь в состоянии предварительной обработки объединенного пользователя; он еще не существует. Затем Keycloak вызывает resetFlow()
внутри этого блока if , где он затем удаляет заметки аутентификации из authenticationSessionModel
.
Ответ №2:
Надеюсь, кто-нибудь найдет более деликатное решение, чем я, но мне удалось решить это с помощью небольшого взлома.
Я заметил, что в провайдере я мог переопределить метод «preprocessFederatedIdentity», и при перечислении там заметок о сеансе пользователя я увидел, что они действительно существуют в сеансе. Однако при достижении метода «authenticationFinished» (также переопределенного) они были удалены из сеанса (очистка, похоже, происходит непосредственно перед достижением метода «updateBrokeredUser»). Это странное поведение происходит только при первом входе в систему.
Затем я заметил, что пользовательские атрибуты, сохраненные в контексте, однако, не очищены. Они сохраняются, и это было ключом к моему решению. Затем я просто перебрал все заметки о сеансе пользователя в методе «preprocessFederatedIdentity» и сохранил их как атрибуты пользователя (с ключом с префиксом «UserSessionNote:»), и на последнем шаге «authenticationFinished» я снова добавляю их в заметки о сеансе пользователя. Я также сохранил все ключи заметок о сеансе пользователя в атрибуте пользователя с именем «UserSessionNotesKeys» в виде строки, разделенной запятой, чтобы я мог просто разделить эту строку и выполнить цикл по атрибутам в методе «authenticationFinished», а затем добавить их в заметки о сеансе пользователя.
Это в основном решило мою проблему общим способом, а также убедилось, что это сработает, если будут добавлены заметки о сеансе пользователя в будущем.