如何为WSO2 Publisher中UI定义的API添加前置自定义序列并注入用户ID
实现方案与最佳实践
步骤1:创建自定义前置序列
你可以直接在WSO2 AM的Carbon管理控制台创建序列,或者用Integration Studio编写后导出部署到AM。以下是实现从IS introspect接口获取用户ID并添加请求头的序列示例:
<sequence name="AddUserIdHeader" xmlns="http://ws.apache.org/ns/synapse"> <!-- 提取请求中的Bearer令牌 --> <property name="AuthorizationHeader" expression="$trp:Authorization"/> <property name="AccessToken" expression="substring-after(get-property('AuthorizationHeader'), 'Bearer ')"/> <!-- 调用WSO2 IS的introspect接口 --> <call> <endpoint> <http method="POST" uri-template="https://{IS_HOST}:{IS_PORT}/oauth2/introspect"> <header name="Content-Type" value="application/x-www-form-urlencoded"/> <header name="Authorization" value="Basic {BASE64_ENCODED_CLIENT_CREDENTIALS}"/> <payloadFactory media-type="form"> <format>token=$1</format> <args> <arg evaluator="xml" expression="$ctx:AccessToken"/> </args> </payloadFactory> </http> </endpoint> </call> <!-- 从introspect响应中提取用户ID(IS响应中通常用`sub`字段标识用户ID) --> <property name="UserId" expression="$body//*[local-name()='active' and text()='true']/../*[local-name()='sub']"/> <!-- 将用户ID添加到请求头,转发给后端 --> <header name="X-User-ID" expression="$ctx:UserId"/> <!-- 清理introspect调用后的临时响应,避免干扰后续流程 --> <property name="RESPONSE" value="false" scope="default" type="STRING"/> <payloadFactory media-type="json"> <format>{}</format> </payloadFactory> </sequence>
注意替换占位符:{IS_HOST}是IS的主机地址,{IS_PORT}是IS的HTTPS端口,{BASE64_ENCODED_CLIENT_CREDENTIALS}是IS中用于introspect接口的客户端ID与密码拼接(格式为clientId:clientSecret)后的Base64编码值。
步骤2:为Publisher中的API配置该序列
- 登录WSO2 API Publisher,打开需要配置的目标API。
- 切换到Runtime Configurations标签页,找到Message Mediation区域。
- 在In Sequence下拉菜单中选择你创建的
AddUserIdHeader序列。 - 保存API并重新发布,后续该API的请求会先经过这个前置序列处理后再转发到后端。
后端识别调用用户的最佳实践
- 优先传递JWT令牌:如果API使用JWT令牌认证,直接将JWT通过
Authorization: Bearer <JWT>头传递给后端。后端可自行验证JWT签名、有效期,并从JWT的sub、email等字段提取用户信息,无需额外调用introspect接口,效率更高。 - 保障自定义头的安全性:如果用自定义头(如
X-User-ID)传递用户ID,要确保前端无法篡改该头——通过AM的序列逻辑严格控制头的生成,同时后端可通过IP白名单、AM与后端的专用认证机制(如mTLS)验证请求来源的合法性。 - 复用AM内置上下文属性:WSO2 AM在完成认证后,会将用户信息存储在上下文属性中,比如
$ctx:api.ut.userName、$ctx:api.ut.userId。如果这些属性能满足需求,无需额外调用IS的introspect接口,直接用这些属性生成请求头即可,减少网络开销。 - 统一用户标识体系:确保WSO2 IS与后端系统使用一致的用户标识(如用户UUID、邮箱),避免因标识不一致导致的用户匹配问题。
内容的提问来源于stack exchange,提问作者mohamed hamada
相关产品推荐
相关产品推荐

