Keycloak автоматический вход после подтверждения электронной почты с отключенным пользователем
Мы используем keycloak (KC) с пользовательскими провайдерами для процесса регистрации. В конце процесса регистрации, перед тем как электронное письмо с подтверждением будет отправлено пользователю (как функция KC по умолчанию), мы отключаем пользователя, так как это соответствует нашему варианту использования.
Когда пользователь нажимает на подтверждение по электронной почте, почта подтверждается, и пользователь автоматически входит в систему, несмотря на то, что он / она отключен в этот момент. Вход в систему после этой работы, как и ожидалось (если пользователь отключен, вход запрещен, в противном случае он успешен).
После просмотра источника Keycloak создается впечатление, что идентификатор сеанса отправляется в письме-подтверждении, и если сеанс уже существует в KC, он автоматически используется повторно, и пользователь продолжает работу, как если бы он вошел в систему. Если сеанс не существует, страница "Подтверждение электронной почты" показано, и пользователь не вошел в систему (как ожидалось).
Чтобы подтвердить мою теорию о том, что KC не проверяет статус пользователя (включен / отключен) в середине существующего сеанса, я отключил пользователя, который в данный момент активен в приложении. Пользователь не вышел из системы или что-то в этом роде.
Мой вывод заключается в том, что когда пользователь завершает регистрацию, сеанс существует, и этот сеанс автоматически "захватывается" после нажатия на ссылку подтверждения. Нигде в середине этого KC не проверяет, включен ли пользователь на самом деле или нет. То же самое, как если бы вы отключили пользователя, когда он / она вошел в систему и просматривает защищенное приложение.
У кого-нибудь есть обходной путь? Мой следующий шаг - как-то программно аннулировать сессию в конце регистрации, чтобы у пользователя не было ни одного при нажатии на письмо с подтверждением. Я не уверен, как отследить эту ошибку на KC jira, так как у них, похоже, нет общедоступного средства отслеживания ошибок. Несмотря на это, не в этом суть этого вопроса - мой вопрос, есть ли у кого-нибудь еще эта проблема, и если да, то как она была решена?
1 ответ
Я решил похожую проблему, написав собственное Обязательное действие. Необходимое действие запускается после проверки электронной почты, поэтому вы можете проверить, включен ли пользователь или нет ( пример действия, требующего секретного вопроса).
В моем случае, если проверка пользователя не в порядке, я перенаправляю на страницу ошибки:
Response challenge =
context.form().setError(MessagesIDs.NOT_VALIDATED_ID).createErrorPage(Status.UNAUTHORIZED);
context.challenge(challenge);
return;