Токен Keycloak не включает сопоставленную заметку о сеансе пользователя при первом входе в систему

#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», а затем добавить их в заметки о сеансе пользователя.

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