如何通过WSO2 API-Manager实现Token从API-1到后端API的传递
WSO2 API Manager实现多后端API令牌无缝传递方案
我现在用WSO2 API Manager对接后端API,其中/api/GetToken负责颁发access token,/api/sendSMS以及其他类似API必须携带这个有效令牌才能调用。目标是实现令牌的无缝传递,已经尝试过在请求头添加自定义sequence策略,下面给具体可行的实现步骤:
1. 编写令牌获取+缓存的自定义中介序列
先创建一个中介序列(Mediation Sequence),核心是避免每次调用都去请求/api/GetToken,逻辑如下:
- 检查缓存里是否有可用令牌
- 有令牌就直接将其添加到请求头(格式如
Authorization: Bearer <token>) - 无令牌则调用
/api/GetToken获取令牌,存入缓存(过期时间和后端令牌有效期对齐)后再添加到请求头
示例序列代码(WSO2中介语言):
<sequence xmlns="http://ws.apache.org/ns/synapse" name="TokenRetrievalSequence"> <!-- 读取缓存中的令牌 --> <property name="cachedToken" expression="get-property('registry', 'conf:/tokens/currentToken')"/> <filter source="$ctx:cachedToken" regex="\S+"> <then> <!-- 缓存存在有效令牌,直接写入请求头 --> <header name="Authorization" expression="fn:concat('Bearer ', $ctx:cachedToken)"/> </then> <else> <!-- 调用GetToken接口获取新令牌 --> <call> <endpoint> <http method="POST" uri-template="https://你的后端域名/api/GetToken"> <!-- 配置GetToken所需的请求参数/头 --> <header name="Content-Type" value="application/x-www-form-urlencoded"/> <payloadFactory media-type="form"> <format>client_id=你的客户端ID&client_secret=你的客户端密钥&grant_type=client_credentials</format> <args/> </payloadFactory> </http> </endpoint> </call> <!-- 从返回结果提取access_token --> <property name="accessToken" expression="json-eval($.access_token)"/> <!-- 将令牌存入缓存,设置过期时间(示例为3600秒) --> <registry resource="conf:/tokens/currentToken" action="update"> <parameter name="value" expression="$ctx:accessToken"/> <parameter name="expiry" value="3600"/> </registry> <!-- 将令牌写入请求头 --> <header name="Authorization" expression="fn:concat('Bearer ', $ctx:accessToken)"/> </else> </filter> </sequence>
2. 将序列绑定到需要令牌的API(如sendSMS)
- 登录WSO2 API Manager的Publisher控制台
- 打开
/api/sendSMS的API编辑页面 - 切换到Message Mediation标签页
- 在In Flow中添加刚才创建的
TokenRetrievalSequence作为入站中介序列 - 保存并发布API
3. 验证令牌传递逻辑
- 调用通过WSO2发布的sendSMS API
- 查看后端
/api/sendSMS的请求日志,确认Authorization头已携带有效令牌 - 检查缓存机制:首次调用会触发GetToken请求,后续调用直接使用缓存令牌,无需重复请求
注意事项
- 确保
/api/GetToken的调用参数(client_id、client_secret等)配置正确,且具备足够权限获取令牌 - 缓存过期时间要与后端返回的
expires_in字段匹配,避免使用过期令牌 - 若需令牌自动刷新,可在序列中添加令牌过期检查逻辑,触发刷新流程
内容的提问来源于stack exchange,提问作者Bas
相关产品推荐
相关产品推荐

