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

如何在Keycloak的setClaim方法中获取令牌请求的自定义参数

解决Keycloak密码模式令牌请求中传递自定义参数并在TokenMapper中获取的问题

核心思路

直接在自定义TokenMapper中通过Keycloak会话上下文获取令牌请求的HTTP参数,无需修改用户属性。密码模式下的令牌请求会经过Keycloak的TokenEndpoint,请求参数可从HttpRequest对象中直接提取。

代码实现

修改你基于TokenMapper示例的插件,在transformAccessToken或transformIdToken方法中添加以下逻辑:

@Override
public void transformAccessToken(AccessToken token, KeycloakSession session, UserModel user, ClientSessionContext clientSessionCtx) {
    // 从会话上下文获取当前HTTP请求
    HttpRequest request = session.getContext().getHttpRequest();
    // 获取请求中的表单参数(密码模式采用application/x-www-form-urlencoded提交)
    MultivaluedMap<String, String> formParams = request.getDecodedFormParameters();
    
    // 提取自定义参数
    String key1 = formParams.getFirst("key1");
    String key2 = formParams.getFirst("key2");
    
    // 将自定义参数添加到令牌声明中
    if (key1 != null) {
        token.getOtherClaims().put("custom_key1", key1);
    }
    if (key2 != null) {
        token.getOtherClaims().put("custom_key2", key2);
    }
    
    // 保留你原有根据用户ID加载数据并添加声明的逻辑
    // 示例:
    // String extraData = loadExtraDataByUserId(user.getId());
    // token.getOtherClaims().put("extra_data", extraData);
}

关键注意事项

  • 确保请求为POST方法,且Content-Type设置为application/x-www-form-urlencoded,自定义参数与标准参数一同放在表单中提交。
  • 处理参数为空的情况,避免空指针异常。
  • 若需在ID令牌中携带这些参数,在transformIdToken方法中添加同样逻辑即可。

备选方案(适用于简单场景)

如果自定义参数是用于标识认证上下文的简单值,可复用OIDC标准的acr_values参数传递,比如acr_values=key1:value1,key2:value2,再在TokenMapper中解析该参数。但此方法仅适合格式简单的场景,复杂参数建议直接提取请求表单参数。

内容的提问来源于stack exchange,提问作者Gohryt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 09:42:27