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

如何通过Keycloak API获取操作令牌(action token)且不发送邮件?

如何通过Keycloak API获取操作令牌(action token)且不发送邮件?

嘿,我刚好碰到过类似的需求,咱们来聊聊你的问题:

先直接给你答案:

  1. 完全可以做到不发送邮件就获取action token,不过Keycloak没有暴露官方的REST API直接干这件事,但有两种可靠的实现方式。
  2. 默认的execute-actions-email接口不会返回token,但通过下面的自定义方案,你可以让Keycloak把token返回给你的后端。

方案一:用Keycloak Admin CLI生成token(快速上手)

Keycloak的Admin CLI工具提供了一个参数,可以生成action token但不触发邮件发送。你可以在后端脚本或服务里调用这个命令,解析返回结果拿到token。

具体命令如下:

kcadm.sh create users/{user-id}/execute-actions-email -r {realm} -s actions=["VERIFY_EMAIL"] -s sendEmail=false

这里的关键参数是sendEmail=false,执行后Keycloak会返回包含action token的JSON响应,格式大概是这样:

{
  "id": "用户ID",
  "actionToken": "你需要的操作令牌",
  "expiresIn": 3600
}

使用时注意:

  • 先通过kcadm.sh config credentials配置好管理员账号的认证信息,或者在命令里通过参数指定
  • 如果你的后端是Java/Node.js等服务,可以通过调用系统命令的方式执行这个CLI命令,然后解析输出的JSON拿到token

方案二:自定义Keycloak SPI(更灵活的API方式)

如果不想依赖CLI,想通过自定义API来获取token,你可以编写Keycloak的SPI扩展,直接调用Keycloak内部的token生成逻辑。

大致步骤:

  1. 编写一个JAX-RS资源类,作为自定义的API端点(比如/admin/realms/{realm}/users/{user-id}/action-token)
  2. 在类中注入Keycloak的KeycloakSession、UserModel等核心依赖
  3. 使用Keycloak内部的ActionTokenUtil类,调用createActionToken方法生成对应的操作令牌(比如VerifyEmailActionToken或ResetPasswordActionToken)
  4. 把生成的token直接返回给调用方,全程不会触发邮件发送

举个简单的代码片段示例(Java):

@Path("/realms/{realm}/users/{userId}/action-token")
public class CustomActionTokenResource {

    @Inject
    private KeycloakSession session;

    @POST
    @Produces(MediaType.APPLICATION_JSON)
    public Response getActionToken(@PathParam("realm") String realmName, 
                                   @PathParam("userId") String userId,
                                   @QueryParam("action") String action) {
        RealmModel realm = session.realms().getRealmByName(realmName);
        UserModel user = session.users().getUserById(userId, realm);
        
        // 生成验证邮箱的token,其他类型token类似
        VerifyEmailActionToken token = new VerifyEmailActionToken(
            user.getId(),
            System.currentTimeMillis() + 3600000, // 1小时过期
            null
        );
        
        String actionToken = session.tokens().encode(token);
        return Response.ok(Map.of("actionToken", actionToken)).build();
    }
}

把这个类打包成Jar,放到Keycloak的providers目录,重启Keycloak后,你的后端就可以通过这个自定义API获取token了。


最后补充几点注意事项

  • 不管用哪种方案,都需要确保调用方拥有足够的管理员权限(比如manage-users权限)
  • 生成的action token有过期时间,默认是1小时,你可以根据需求调整
  • 自定义SPI时,要注意Keycloak的版本兼容性,不同版本的内部API可能有细微差异

备注:内容来源于stack exchange,提问作者Самир Шахмурадлы

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 10:34:29