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

基于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

  1. 登录WSO2 APIM管理控制台,进入Mediations > Sequences,点击Add Sequence,选择Custom Sequence,粘贴上述XML代码并保存。
  2. 编辑目标API,进入Resources标签页,选择需要处理的资源(如GET /getlist4user)。
  3. 在该资源的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 13:00:09