如何在SOA 12c中通过动态变量实现Basic Authentication
实现BPEL变量作为Basic Authentication发送至SOAP服务
核心思路
Basic Authentication的本质是将用户名:密码格式的字符串进行Base64编码后,放在HTTP请求头的Authorization字段中,格式为Basic [Base64编码字符串]。结合你已有的BPEL变量,只需完成字符串拼接→Base64编码→设置HTTP头三个步骤即可实现。
具体实现(以Oracle SOA Suite为例)
你的代码中使用了bpelx前缀,默认按Oracle SOA Suite环境给出方案:
定义辅助变量
在BPEL流程的变量部分,新增两个辅助变量:authStringVar:存储拼接后的用户名:密码字符串encodedAuthVar:存储Base64编码后的结果
添加赋值活动完成编码与头设置
在现有Assign_Authentication活动之后,新增一个赋值活动:
<assign name="Prepare_Basic_Auth"> <!-- 1. 拼接用户名和密码为 username:password 格式 --> <copy> <from expression="concat($usernameVar, ':', $passwordVar)" expressionLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0"/> <to>$authStringVar</to> </copy> <!-- 2. 使用Oracle扩展函数进行Base64编码 --> <copy> <from expression="ora:base64encode($authStringVar)" expressionLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0"/> <to>$encodedAuthVar</to> </copy> <!-- 3. 设置HTTP Authorization请求头 --> <copy> <from expression="concat('Basic ', $encodedAuthVar)" expressionLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0"/> <to>$invokeTargetService_InputVariable.headers['Authorization']</to> </copy> </assign>
- 关联调用活动
确保调用目标SOAP服务的invoke活动使用上述设置了头的输入变量:
<invoke name="Invoke_Target_Service" inputVariable="invokeTargetService_InputVariable" outputVariable="invokeTargetService_OutputVariable" partnerLink="TargetServicePartnerLink"/>
注意事项
- 若目标服务的WSDL未定义HTTP头,可通过
bpelx:property直接在invoke活动中绑定头变量:
<invoke name="Invoke_Target_Service" inputVariable="invokeTargetService_InputVariable" outputVariable="invokeTargetService_OutputVariable" partnerLink="TargetServicePartnerLink"> <bpelx:property name="http.headers" variable="encodedAuthVar"/> </invoke>
- 其他BPEL引擎(如Apache ODE)需替换Base64编码函数,例如使用自定义扩展函数或符合引擎规范的编码方法。
内容的提问来源于stack exchange,提问作者Oyindrila Bhattacharjee
相关产品推荐
相关产品推荐

