WSO2 APIM中如何将JWT的preferred_username映射到Siddhi查询的userId
解决思路
- 先验证JWT令牌内容:用jwt.io解析API调用时携带的JWT令牌,确认
preferred_username字段是否存在。如果Keycloak没返回这个字段,先在Keycloak客户端配置里,把preferred_username添加到客户端范围的「可选声明」并设置为默认返回,确保令牌包含该字段。 - 检查Claim Mapping配置方向:确认你配置的映射是「Keycloak的远程声明
preferred_username」映射到「WSO2的本地声明http://wso2.org/claims/userid」,不要搞反映射方向。 - 启用密钥管理器的Claim Mapping开关:在WSO2 APIM的Keycloak密钥管理器配置页面,检查是否开启了「启用声明映射」选项,默认可能未启用,需手动开启后保存配置。
- 验证WSO2本地声明配置:登录WSO2 APIM的管理控制台,进入「身份 > 声明 > 管理声明」,找到
http://wso2.org/claims/userid声明,确认它的属性设置正确,没有被其他规则覆盖,且标记为支持映射。 - 检查Siddhi Query的取值方式:如果自定义策略里用的是
$userId模板,确认它是否对应WSO2上下文中的userid声明。也可以尝试用$ctx:http://wso2.org/claims/userid直接提取声明值,避免模板变量的歧义。 - 重启服务生效配置:修改Keycloak和WSO2 APIM的配置后,务必重启两个服务,确保新的声明映射规则被加载。
- 排查WSO2声明过滤规则:检查
<APIM_HOME>/repository/conf/identity/identity.xml中的Claim相关配置,确认没有全局规则过滤掉preferred_username或userid声明。
内容的提问来源于stack exchange,提问作者Tonny Tc
相关产品推荐
相关产品推荐

