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

如何为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配置该序列

  1. 登录WSO2 API Publisher,打开需要配置的目标API。
  2. 切换到Runtime Configurations标签页,找到Message Mediation区域。
  3. 在In Sequence下拉菜单中选择你创建的AddUserIdHeader序列。
  4. 保存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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 17:57:39