如何通过Keycloak API获取操作令牌(action token)且不发送邮件?
如何通过Keycloak API获取操作令牌(action token)且不发送邮件?
嘿,我刚好碰到过类似的需求,咱们来聊聊你的问题:
先直接给你答案:
- 完全可以做到不发送邮件就获取action token,不过Keycloak没有暴露官方的REST API直接干这件事,但有两种可靠的实现方式。
- 默认的
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生成逻辑。
大致步骤:
- 编写一个JAX-RS资源类,作为自定义的API端点(比如
/admin/realms/{realm}/users/{user-id}/action-token) - 在类中注入Keycloak的
KeycloakSession、UserModel等核心依赖 - 使用Keycloak内部的
ActionTokenUtil类,调用createActionToken方法生成对应的操作令牌(比如VerifyEmailActionToken或ResetPasswordActionToken) - 把生成的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,提问作者Самир Шахмурадлы
相关产品推荐
相关产品推荐

