如何在WSO2 API Manager序列中获取IdP终端用户ID并设置Authorization头
方案可行性确认
你描述的需求完全可以通过WSO2 API Manager的自定义请求调解序列实现,无需额外拓展组件。
具体实现步骤
1. 前置配置
首先完成基础对接配置:
- 将Keycloak配置为WSO2 API Manager的信任第三方IdP,确保API Manager可以正常解析、校验Keycloak签发的JWT令牌
- 确认需要提取的终端用户ID来源:默认配置下解析后的用户ID会存储在API网关上下文属性
api.ut.userId中,如果你需要从Keycloak JWT的自定义Claim(比如sub字段)提取,需要提前在API Manager的JWT Claim映射配置中放开对应字段的提取权限。
2. 编写自定义请求调解序列
你可以直接在API Manager的管理控制台新建自定义调解序列,参考示例代码如下:
<!-- 提取终端用户ID,这里以从网关上下文提取为例 --> <property name="endUserId" expression="$ctx:api.ut.userId" scope="default" type="STRING"/> <!-- 此处添加你需要的用户ID自定义修改逻辑,示例为给用户ID添加legacy_前缀 --> <property name="processedUserId" expression="fn:concat('legacy_', $ctx:endUserId)" scope="default" type="STRING"/> <!-- 适配后端Basic Auth要求,拼接用户名密码后做Base64编码 --> <!-- 如果你后端的用户密码为固定值或可以通过其他逻辑获取,直接替换示例中的default_pass即可 --> <property name="authRawContent" expression="fn:concat($ctx:processedUserId, ':default_pass')" scope="default" type="STRING"/> <property name="authEncodedContent" expression="base64Encode($ctx:authRawContent)" scope="default" type="STRING"/> <!-- 覆盖请求的Authorization传输头,原有客户端传入的JWT头会被替换 --> <property name="Authorization" expression="fn:concat('Basic ', $ctx:authEncodedContent)" scope="transport" type="STRING"/>
如果你的后端不需要标准Basic Auth格式,直接将处理后的用户ID设置到Authorization头即可,替换最后一段配置即可。
3. 序列挂载
在发布对应遗留服务API时,将「请求调解序列」选择为你刚才创建的自定义序列,同时将API的认证方式设置为OAuth2即可。
配置完成后就可以实现你期望的完整调用流程,API Manager会自动校验JWT有效性、提取处理用户ID、替换授权头后转发到后端遗留服务。
内容的提问来源于stack exchange,提问作者Tonny Tc
相关产品推荐
相关产品推荐

