Как вызвать службу REST из BPEL в Oracle SOA с базовой аутентификацией?

Я работаю с Oracle Fusion Middleware 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>
....

С помощью этого кода я вызываю службу REST, которая не защищена BASIC_Auth, и она отлично работает.

Теперь, когда я переключаюсь в удаленную среду, которая требует базовой аутентификации, мне не удалось добиться успеха.

Я нашел несколько примеров для вызова служб 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 (имя пользователя, пароль, preemptiveBasicAuth), используется движком SOA для создания запроса REST.

(Я хотел бы указать, что это не проблема пользователя / пароля: когда я тестирую этот REST-запрос с тем же пользователем / паролем из Postman, он работает нормально.)

Как я могу вызвать службу REST с базовой аутентификацией из soa-композитного?


person Val Bonn    schedule 30.01.2017    source источник


Ответы (2)



Вы можете попробовать OWSM oracle / http_jwt_token_client_policy, чтобы передать требуемые заголовки в запросе.

person Pankaj Nanda    schedule 08.05.2017