You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Keycloak中用户JWT令牌签发时发送邮件?

解决方案:监听JWT签发事件的Keycloak自定义监听器修改

首先明确Keycloak中与用户JWT令牌签发相关的核心事件类型:

  • CODE_TO_TOKEN:用户通过授权码兑换Access Token/JWT时触发
  • REFRESH_TOKEN:用户通过刷新令牌获取新的Access Token/JWT时触发

这两个事件覆盖了用户获取JWT的主要场景(排除初始登录触发的场景)。

代码修改步骤

  1. 修改事件类型判断逻辑
    将原有的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);
        }
    }
}
  1. 可选:补充异常处理
    为避免用户数据异常影响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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 18:39:53