如何在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
相关产品推荐
相关产品推荐

