如何使用基本身份验证从Oracle SOA中的BPEL调用REST服务?

时间:2017-01-30 10:51:32

标签: basic-authentication bpel oracle-fusion-middleware oracle-soa

我正在使用Oracle融合中间件12.1.3,我正在开发一个BPEL流程,该流程必须调用需要基本身份验证的远程REST服务。

我为Rest服务创建了一个外部引用,在我的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服务已经适应&#34;在使用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被复制了#34;在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中添加的内容(属性username,password,preemptiveBasicAuth)是否被SOA引擎用于构建REST请求。

(我想指出它不是用户/密码问题:当我使用Postman中的相同用户/密码测试此REST查询时,它可以正常工作。)

如何使用soa-composite中的基本身份验证来管理调用REST服务?

1 个答案:

答案 0 :(得分:0)

您可以在BPEL中发送自定义HTTP标头。

看看这个post。您需要在参考服务上添加oracle.webservices.http.headers,然后可以填充变量并按照BPEL中的REST调用方式发送它们。