如何在Keycloak中用户JWT令牌签发时发送邮件?
解决方案:监听JWT签发事件的Keycloak自定义监听器修改
首先明确Keycloak中与用户JWT令牌签发相关的核心事件类型:
CODE_TO_TOKEN:用户通过授权码兑换Access Token/JWT时触发REFRESH_TOKEN:用户通过刷新令牌获取新的Access Token/JWT时触发
这两个事件覆盖了用户获取JWT的主要场景(排除初始登录触发的场景)。
代码修改步骤
- 修改事件类型判断逻辑
将原有的EventType.LOGIN判断替换为针对目标事件的判断:
public void onEvent(Event event) { // 监听授权码换JWT和刷新JWT的事件 if (EventType.CODE_TO_TOKEN.equals(event.getType()) || EventType.REFRESH_TOKEN.equals(event.getType())) { String userId = event.getUserId(); // 避免空指针异常,先校验用户ID if (userId != null) { String email = session.users().getUserById(session.getContext().getRealm(), userId).getEmail(); sendEmail(email); } } }
- 可选:补充异常处理
为避免用户数据异常影响Keycloak核心流程,可添加异常捕获逻辑:
public void onEvent(Event event) { if (EventType.CODE_TO_TOKEN.equals(event.getType()) || EventType.REFRESH_TOKEN.equals(event.getType())) { String userId = event.getUserId(); if (userId != null) { try { UserModel user = session.users().getUserById(session.getContext().getRealm(), userId); // 确保用户存在且邮箱有效 if (user != null && user.getEmail() != null && !user.getEmail().isEmpty()) { sendEmail(user.getEmail()); } } catch (Exception e) { // 记录异常日志,不中断Keycloak流程 session.getContext().getLogger().error("发送JWT签发通知邮件失败", e); } } } }
逻辑验证
- 用户通过OAuth2授权码模式兑换JWT时,
CODE_TO_TOKEN事件触发,邮件自动发送 - 用户使用Refresh Token获取新JWT时,
REFRESH_TOKEN事件触发,邮件自动发送
内容的提问来源于stack exchange,提问作者user13347928
相关产品推荐
相关产品推荐

