我正在使用 Oracle Fusion Middleware 12.1.3,并且我正在开发一个 BPEL 流程,该流程必须调用需要基本身份验证的远程 REST 服务。
我创建了对 Rest Service的外部引用composite.xml
,在我的中,它看起来像这样:
....
<component name="MyCompositeBASProcess" version="2.0">
<implementation.bpel src="BPEL/MyCompositeBASProcess.bpel"/>
<componentType>
<service name="mycompositebasprocess_client" ui:wsdlLocation="WSDLs/MyCompositeBASProcess.wsdl">
<interface.wsdl interface="http://xmlns.oracle.com/myPartitionSOA/MyCompositeBAS/MyCompositeBASProcess#wsdl.interface(MyCompositeBASProcess)"
callbackInterface="http://xmlns.oracle.com/myPartitionSOA/MyCompositeBAS/MyCompositeBASProcess#wsdl.interface(MyCompositeBASProcessCallback)"/>
</service>
<reference name="CMProxyRS" ui:wsdlLocation="WSDLs/CMProxyRS.wsdl">
<interface.wsdl interface="http://xmlns.oracle.com/myPartitionSOA/MyCompositeBAS/CMProxyRS#wsdl.interface(CMProxyRS_ptt)"/>
</reference>
</componentType>
<property name="bpel.config.oneWayDeliveryPolicy" type="xs:string" many="false">async.persist</property>
</component>
<reference name="CMProxyRS" ui:wsdlLocation="WSDLs/CMProxyRS.wsdl">
<interface.wsdl interface="http://xmlns.oracle.com/myPartitionSOA/MyCompositeBAS/CMProxyRS#wsdl.interface(CMProxyRS_ptt)"/>
<binding.rest config="Adapters/CMProxyRS.wadl" location="http://server_WITHOUT_basic-auth/cmproxy/resources/v2/" />
</reference>
....
使用这段代码,我调用了一个不受 BASIC_Auth 保护的 REST 服务,它工作正常。
现在,当我切换到需要基本身份验证的远程环境时,我没有成功。
我找到了一些使用基本身份验证调用 SOAP 服务的示例,但对于 REST 服务来说没有什么真正有趣的。但是,在 Oracle Fusion 堆栈 12.1.3 中,REST 服务在使用之前“适应”了 SOAP 服务,所以我认为我可以使用我找到的示例。
所以,我更新了我composite.xml
的添加用户/密码和策略:
....
<reference name="CMProxyRS" ui:wsdlLocation="WSDLs/CMProxyRS.wsdl">
<interface.wsdl interface="http://xmlns.oracle.com/myPartitionSOA/MyCompositeBAS/CMProxyRS#wsdl.interface(CMProxyRS_ptt)"/>
<binding.rest config="Adapters/CMProxyRS.wadl" location="http://server_WITH_basic-auth/cmproxy/resources/v2/">
<wsp:PolicyReference URI="oracle/wss_username_token_client_policy" orawsp:category="security" orawsp:status="enabled"/>
<!-- <property name="oracle.webservices.auth.username">weblogic</property> -->
<!-- <property name="oracle.webservices.auth.password">password</property> -->
<property name="oracle.webservices.preemptiveBasicAuth">true</property>
<property name="javax.xml.ws.security.auth.username" many="false" override="may">weblogic</property>
<property name="javax.xml.ws.security.auth.password" many="false" override="may">password</property>
</binding.rest>
</reference>
....
如您所见,我尝试使用javax.xml.ws.security.auth.
属性和oracle.webservices.auth.
属性。但两者都失败了:在遥控器上,我在请求中没有得到任何基本身份验证。
我还更新了我CMProxyRS.wadl
以Authorization
在HTTP Header
. 例如 :
<resources>
<resource path="/documents">
<method name="GET" soa:wsdlOperation="searchDocument">
<request>
<param name="Authorization" style="header" soa:expression="$msg.request/tns:Authorization" default="" type="xsd:string"/>
<param name="queryText" style="query" soa:expression="$msg.request/tns:queryText" default="" type="xsd:string"/>
<param name="fields" style="query" soa:expression="$msg.request/tns:fields" default="id,name,originalName,originalFormat,originalExtension,alternateFormat,alternateExtension,revision" type="xsd:string"/>
<param name="waitForIndexing" style="query" soa:expression="$msg.request/tns:waitForIndexing" default="false" type="xsd:boolean"/>
</request>
<response status="200">
....
这Authorization
在 WSDL 中被“复制”了。CMProxyRS.wsdl
:
<element name="searchDocument_params">
<complexType>
<sequence>
<element name="Authorization" type="string"/>
<element name="queryText" type="string"/>
<element name="fields" type="string"/>
<element name="waitForIndexing" type="boolean"/>
</sequence>
</complexType>
</element>
这没有帮助。事实上,我真的不确定composite.xml
SOA 引擎是否使用我在我的(属性用户名、密码、preemptiveBasicAuth)中添加的内容来构建 REST 请求。
(我想说明这不是用户/密码问题:当我使用来自 Postman 的相同用户/密码测试此 REST 查询时,它工作正常。)
如何从 soa-composite 调用具有基本身份验证的 REST 服务?