如何通过WSO2 API网关调用OAuth认证的后端服务?
实现WSO2网关向后端注入OAuth Token的方案(无需API Publisher默认配置)
绝对有办法实现你想要的流程!不用局限于API Publisher的默认配置,咱们可以通过**自定义中介序列(Mediation Sequence)**来让网关自动获取并注入后端服务的OAuth AccessToken,完美适配你的请求链路:浏览器(带网关AccessToken)→WSO2网关(注入后端AccessToken)→后端服务。
步骤1:准备后端OAuth的客户端信息
首先得拿到后端服务OAuth体系的关键信息:
- 后端的令牌端点(比如
https://your-backend-auth/token) - 后端分配的客户端ID和客户端密钥(用于通过客户端凭证模式获取令牌)
步骤2:在管理控制台创建自定义中介序列
直接登录WSO2 AM的管理控制台(Admin Console),全程不用碰API Publisher:
- 进入左侧菜单的 Mediation > Sequences > Add Sequence
- 选择「Custom Sequence」,给序列起个好记的名字(比如
BackendOAuthTokenInjector) - 把以下XML配置粘贴进去(记得替换成你的实际信息):
<sequence xmlns="http://ws.apache.org/ns/synapse" name="BackendOAuthTokenInjector"> <!-- 调用后端OAuth服务获取AccessToken(客户端凭证模式) --> <call> <endpoint> <http method="post" uri-template="https://your-backend-auth/token"> <header name="Content-Type" value="application/x-www-form-urlencoded"/> </http> </endpoint> <payloadFactory media-type="form"> <format>grant_type=client_credentials&client_id=$1&client_secret=$2</format> <args> <arg value="YOUR_BACKEND_CLIENT_ID"/> <arg value="YOUR_BACKEND_CLIENT_SECRET"/> </args> </payloadFactory> </call> <!-- 从响应中提取AccessToken,存入属性 --> <property expression="json-eval($.access_token)" name="BACKEND_TOKEN" scope="default" type="STRING"/> <!-- 将AccessToken注入到请求的Authorization头 --> <header name="Authorization" expression="fn:concat('Bearer ', get-property('BACKEND_TOKEN'))" scope="transport"/> <!-- 继续把请求转发到后端服务 --> <send/> </sequence>
小提示:如果后端令牌有效期较长,建议添加
<cache>中介来缓存令牌,避免每次请求都调用后端令牌端点,提升网关性能。
步骤3:把中介序列绑定到目标API
虽然不用API Publisher,但需要让目标API使用这个序列:
- 在管理控制台的 API > List 里找到你要配置的API,点击「Edit」
- 切换到「Runtime Configurations」标签页
- 在「Request Mediation Sequence」下拉框中选择你刚才创建的
BackendOAuthTokenInjector - 保存配置并重新部署API
步骤4:验证整个流程
现在测试一下是否符合预期:
- 先通过WSO2 AM的正常OAuth流程获取网关的AccessToken
- 浏览器带着这个AccessToken请求网关的API
- 网关会先验证这个AccessToken的有效性(默认自带的逻辑)
- 然后执行自定义中介序列,自动获取后端的AccessToken并注入到请求头
- 后端服务收到带有效AccessToken的请求,处理后返回响应
其他可选方案
如果需要更灵活的处理,还可以试试这两种方式:
- 密钥管理器扩展:如果后端OAuth服务器是标准的OIDC/OAuth2服务,可以配置WSO2的密钥管理器来自动处理后端令牌的生命周期管理,不用写太多中介代码
- 脚本中介:如果需要处理令牌过期、复杂缓存逻辑,可以用
<script>中介写JavaScript代码来实现,灵活性更高
内容的提问来源于stack exchange,提问作者Kacem
相关产品推荐
相关产品推荐

