Keycloak操作令牌:当用户请求多个操作时,如何使用户的先前操作无效例如,重置密码

问题描述

我希望能够使身份验证流程中的用户的任何操作令牌无效。

方案是用户发送重置密码并收到带有相关操作令牌的电子邮件。然后,用户发送另一个重置密码,并获得另一个电子邮件,该电子邮件具有关联的其他操作令牌。在第一个操作令牌到期时间的期限内,用户可以使用两封电子邮件中的链接-但是,我希望能够在我的自定义重置密码身份验证流程中识别出用户正在请求重复的操作请求并使其先前的请求无效操作令牌,以便仅使用其最新的重置密码链接

我一直在查看以下对象,但没有找到与所有用户活动相关联的动作令牌存储的运气,而不仅仅是他们当前经过身份验证的会话。

AuthenticationFlowContext context;

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

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

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

谢谢。

解决方法

我已经通过维护每个流的用户和操作令牌表来解决此问题。这意味着,当用户启动新的操作流时,如果仍然有效,则可以获取先前的令牌,并使用ActionTokenStoreProvider使它无效,并用新的令牌替换它。我仍然希望keycloak具有某种内部机制来管理它,而不是我自己的自定义代码。如果知道这一点,请放弃解决方案!