Токены действия Keycloak: как аннулировать предыдущее действие пользователя при запросе нескольких (например, сбросить пароль)

#authentication #single-sign-on #token #keycloak

#аутентификация #единый вход #токен #keycloak

Вопрос:

Я хочу иметь возможность аннулировать любой токен действия для пользователя в потоке аутентификации.

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

Я просматривал приведенные ниже объекты, но мне не повезло найти хранилище токенов действия, связанное со всей активностью пользователя, а не только с их текущим сеансом аутентификации.

 AuthenticationFlowContext context;

            List<UserSessionModel> sessions = context.getSession().sessions().getUserSessions(context.getRealm(), user);

            RootAuthenticationSessionModel parentSessions = context.getAuthenticationSession().getParentSession();

            ActionTokenStoreProvider actionTokenStore = session.getProvider(ActionTokenStoreProvider.class);
  

Заранее спасибо.

Ответ №1:

Я решил эту проблему, поддерживая таблицу пользователей и токенов действия для каждого потока. Это означает, что когда пользователь инициирует новый поток действий, я могу захватить предыдущий токен, если он все еще действителен, и использовать ActionTokenStoreProvider, чтобы аннулировать его, заменив его новым токеном. Я все еще надеюсь, что keycloak имеет какой-то внутренний механизм для управления этим, а не мой собственный пользовательский код. Отбросьте решение, если вы знаете об этом!