基于WSO2 API Manager 4.3.0从Keycloak获取用户属性并转换请求
解决方案:WSO2 APIM 4.3.0 实现认证后获取Keycloak用户属性并修改请求路径
在WSO2 APIM中,你可以通过**自定义中介序列(Mediation Sequence)**实现类似Kong自定义插件的功能,无需编写Java代码,直接用Synapse XML语法就能完成需求。以下是具体实现步骤:
1. 前置准备
确保Keycloak已作为身份提供商(IDP)配置完成,且WSO2 APIM能成功验证Keycloak颁发的JWT令牌,同时能从令牌中解析出用户邮箱(后续用于调用Keycloak接口)。
2. 编写自定义中介序列
该序列将完成:提取用户邮箱和令牌 → 调用Keycloak接口获取uuid → 修改请求路径三个核心动作。
创建一个名为FetchUserUUIDAndRewritePath的自定义序列,代码如下:
<?xml version="1.0" encoding="UTF-8"?> <sequence xmlns="http://ws.apache.org/ns/synapse" name="FetchUserUUIDAndRewritePath"> <!-- 提取请求头中的Keycloak访问令牌 --> <property name="AuthorizationHeader" expression="$trp:Authorization" scope="default" type="STRING"/> <!-- 从认证上下文提取用户邮箱(WSO2会自动解析JWT中的email声明到该上下文变量) --> <property name="UserEmail" expression="$ctx:claims.email" scope="default" type="STRING"/> <!-- 调用Keycloak的用户属性接口 --> <call> <endpoint> <http method="GET" uri-template="https://whatever.com/getlist4user?email={uri.var.UserEmail}"> <header name="Authorization" expression="$ctx:AuthorizationHeader"/> </http> </endpoint> </call> <!-- 解析响应中的uuid字段(假设Keycloak返回的JSON/XML中包含uuid节点) --> <property name="UserUUID" expression="//uuid/text()" scope="default" type="STRING"/> <!-- 重写请求路径为目标格式 --> <property name="REST_URL_POSTFIX" expression="fn:concat('/list/', $ctx:UserUUID)" scope="axis2" type="STRING"/> <!-- 标记当前调用为非响应模式,继续转发请求到后端 --> <property name="OUT_ONLY" value="true" scope="default" type="STRING"/> </sequence>
3. 部署并关联到API
- 登录WSO2 APIM管理控制台,进入Mediations > Sequences,点击Add Sequence,选择Custom Sequence,粘贴上述XML代码并保存。
- 编辑目标API,进入Resources标签页,选择需要处理的资源(如
GET /getlist4user)。 - 在该资源的In Flow中,添加刚才创建的自定义序列,确保序列位于OAuth2认证步骤之后(保证先完成身份验证再执行自定义逻辑)。
关键注意事项
- 网络连通性:Docker部署环境下,确保WSO2容器能访问Keycloak的
getlist4user接口,可通过容器网络配置实现(如加入同一Docker网络)。 - 错误处理:建议在序列中添加错误分支,处理Keycloak接口调用失败的情况(如返回500错误),示例:
<faultSequence> <log level="full" category="ERROR"/> <respond> <payloadFactory media-type="json"> <format>{"error": "Failed to fetch user UUID"}</format> </payloadFactory> </respond> </faultSequence> - 性能优化:如果用户uuid不会频繁变更,可添加缓存逻辑避免重复调用Keycloak接口,使用
<cache>中介实现。 - 令牌权限:确认用户的Keycloak访问令牌具备调用
getlist4user接口的权限,若需服务级调用,可配置WSO2使用服务账号令牌访问Keycloak。
内容的提问来源于stack exchange,提问作者Joe M
相关产品推荐
相关产品推荐

