2010-10-14 20 views
5

È necessario connettersi a un servizio Web che richiede credenziali di autenticazione sotto forma di nome utente e password in testo normale.Autenticazione SOAP con PHP

Ho una conoscenza di base di SOAP e sono riuscito a collegarmi ad altri servizi Web aperti che non richiedono un nome utente o una password utilizzando NuSOAP.

Quanto segue è stato inviato a me:

<?php 

// Set up security options 
$security_options = array("useUsernameToken" => TRUE); 
$policy = new WSPolicy(array("security" => $security_options)); 

$security_token = new WSSecurityToken(array(
    "user" => "xxx", 
    "password" => "xxx", 
    "passwordType" => "basic")); 

// Create client with options 
$client = new WSClient(array("wsdl" => "https://xxx.asmx?wsdl", 
    "action" => "http://xxx", 
    "to" => "https://xxx", 
    "useWSA" => 'submission', 
    "CACert" => "cert.pem", 
    "useSOAP" => 1.1, 
    "policy" => $policy, 
    "securityToken" => $security_token)); 

// Send request and capture response 
$proxy = $client->getProxy(); 

$input_array = array("From" => "2010-01-01 00:00:00", 
    "To" => "2010-01-31 00:00:00"); 

$resMessage = $proxy->xxx($input_array); 
?> 

Dopo alcune ricerche ho capito che quanto sopra implementazione utilizza WSO2. Devo essere in grado di farlo senza usare wso2.

Ho fatto del mio meglio per cercare risorse (Google, forum, ecc.) Riguardo a quanto sopra ma non sono stato in grado di trovare nulla. Ho letto alcuni tutorial su SOAP e sono stato in grado di configurare un client SOAP usando PHP, ma non riesco a capire come funziona l'autenticazione e le "politiche".

Una spiegazione su come ottenere questo e forse alcuni link a ulteriori informazioni su questo sarebbe molto apprezzato come sto strappando i capelli! Idealmente vorrei alcuni collegamenti alle risorse per un principiante assoluto all'autenticazione SOAP.

Grazie. P.S alcuni dei link/credenziali di cui sopra potrebbero essere stati xxx'd per la privacy.

risposta

9

Se l'estensione SOAP è abilitata in php (versione php> = 5.0.1), è possibile utilizzare la classe SoapClient per elaborare la richiesta. Per autenticare, è possibile passare il nome utente e la password per la classe con l'URL di destinazione:

$soapURL = "https://www.example.com/soapapi.asmx?wsdl" ; 
$soapParameters = Array('login' => "myusername", 'password' => "mypassword") ; 
$soapFunction = "someFunction" ; 
$soapFunctionParameters = Array('param1' => 42, 'param2' => "Search") ; 

$soapClient = new SoapClient($soapURL, $soapParameters); 

$soapResult = $soapClient->__soapCall($soapFunction, $soapFunctionParameters) ; 

if(is_array($soapResult) && isset($soapResult['someFunctionResult'])) { 
    // Process result. 
} else { 
    // Unexpected result 
    if(function_exists("debug_message")) { 
     debug_message("Unexpected soapResult for {$soapFunction}: ".print_r($soapResult, TRUE)) ; 
    } 
} 

Se non siete sicuri delle funzioni è possibile chiamare, è possibile visualizzare l'URL di destinazione (ad esempio, che termina in". asmx? wsdl ") nel tuo browser. È necessario ottenere una risposta XML che indichi le funzioni SOAP disponibili che è possibile chiamare e i parametri previsti di tali funzioni.

+0

ho provato quanto sopra e anche incluso i parametri extra dal mio codice originale a $ soapFunctionParameters ma sto ottenendo l'eccezione "Azione per il destinatario finale è richiesta ma non presente nel messaggio". Cosa ne pensi della funzione WSPolicy e WSSecurity token? Ancora una volta, sono davvero un elemosina per questo. –

+0

FYI- $ soapFunctionParameters in $ soapResult = ... soapCall() è scritto in modo errato. Mi sono imbattuto in questo mentre cercavo queste informazioni e stavo usando il tuo codice per testare. Può essere irrilevante dal 2010. – Travis

+0

@guss In che modo il server di sapone quindi autentica i dati di accesso passati con l'array '$ soapParameters' al soapclient? Nel mio script PHP soap server, '$ _SERVER ['PHP_AUTH_USER']' non è impostato, quindi come dovrei convalidare? –