2010-04-29 45 views

Respuesta

8

Una manera más fácil sería autenticarse en la primera consulta, crear un registro de sesión en el lado del servidor que contenga la dirección IP remota y un token que le dé al cliente como authToken. Luego haga que el cliente pase este authToken en futuras consultas. Este authToken tiene que coincidir con los datos de la sesión interna que guarda sobre el cliente, pero le permite evitar tener que hacer viajes de ida y vuelta a la base de datos solo para hacer la autenticación.

Dicho esto, @Marcus Adams tiene un buen punto a continuación con respecto a la apatridia. Hay personas presionando todo tipo de SOAP security models. WS-Security es el estado actual del arte, aquí. Todos funcionan al colocar información de autenticación en el encabezado SOAP; después de todo, es por eso que un mensaje SOAP contiene un encabezado y una parte del cuerpo.

+1

Esta es la forma habitual hasta donde yo sé. También permitiría que el inicio de sesión tenga un punto final encriptado SSL (para obtener la clave) y use puntos finales no encriptados para las solicitudes de datos (si los datos pueden enviarse desprotegidos, por supuesto). – extraneon

2

Hacer que el usuario envíe el nombre de usuario y la contraseña con cada solicitud es la forma en que he visto implementar la mayoría de las interfaces SOAP. En realidad, no he visto ninguna otra implementación que no sea la API clave idea, que es simplemente intercambiar un nombre de usuario y una contraseña para algún otro token.

Las interfaces SOAP deben ser sin estado, como HTTP, por lo que esto parece una consecuencia normal.

2

Defina un encabezado SOAP personalizado e intercambie las credenciales de autenticación en el encabezado. Lea los valores del encabezado y autentíquese.

0

Aquí está un ejemplo sencillo de cómo utilizar una validación de la API en la cabecera:

archivo cartera de operaciones de búsqueda-client.php

<?php 
ini_set("soap.wsdl_cache_enabled", "0"); // disabling WSDL cache 
class portfolioLookupAuth 
{ 
    public $apiKey; 
    public function __construct($key) 
    { 
     $this->apiKey = $key; 
    } 
} 
$apiKey = "123456"; 
$url = 'http://mysite.com/php5soap/portfolio-lookup.wsdl'; 
$client = new SoapClient($url, array("trace" => 1, "exception" => 0)); 

// Create the header 
$auth = new portfolioLookupAuth($apiKey); 
// SoapHeader::__construct (string $namespace , string $name [, mixed $data [, bool $mustunderstand [, string $actor ]]]) 
$header = new SoapHeader($url, "APIValidate", $auth, false); 

    try { 

    $result = $client->__soapCall("getPortfolioByName", array("portfolioName" => "WQAM"), NULL, $header);  
    print_r($result); 

    print "<pre>\n"; print "Request :\n".htmlspecialchars($client->__getLastRequest()) ."\n"; 
    print "Response:\n".htmlspecialchars($client->__getLastResponse())."\n"; print "</pre>";  

    } catch (SoapFault $exception) { 

    echo 'Exception Thrown: '.$exception->faultstring.'<br><br>'; 

    } 

?> 

archivo cartera de operaciones de búsqueda-server.php

<?php 
ini_set("soap.wsdl_cache_enabled", "0"); // disabling WSDL cache 

class PortfolioLookupService { 

    private $apiKey = '123456'; 

    private $portfolios = array(
      'WPOW' => 'Power 96 party station.', 
      'WQAM' => 'Sports radio site.', 
      'WJBR' => 'Cool sites for bands.', 
      'WKIS' => 'Kiss Country 2', 

); 

    public function APIValidate($auth){ 

    if($auth->apiKey != $this->apiKey){ 
     throw new SoapFault("Server", "Incorrect key"); 
    } 

    } 

    function getPortfolioByName($portfolioName) { 
    //print_r($portfolioName); exit(); 
    if (isset($this->portfolios[$portfolioName])) { 
     return $this->portfolios[$portfolioName]; 
    } else { 
     return 'Portfolio name "'.$portfolioName.'" not found.'; 
     //throw new SoapFault('code', 'string', 'actor', 'detail', 'name', 'header'); 
     throw new SoapFault("Server","Unknown Name '$portfolioName'.");  
    } 
    } 

    function getPortfoliosAll() { 
     return $this->portfolios; 
    }  

} 

$server = new SoapServer("portfolio-lookup.wsdl"); 
$server->setClass("PortfolioLookupService"); 
$server->handle(); 

?> 

archivo cartera lookup.wsdl

<?xml version ='1.0' encoding ='UTF-8' ?> 

<definitions name='PortfolioLookup' 

    targetNamespace='http://example.org/PortfolioLookup' 

    xmlns:tns='PortfolioLookup' 

    xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' 

    xmlns:xsd='http://www.w3.org/2001/XMLSchema' 

    xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/' 

    xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/' 

    xmlns='http://schemas.xmlsoap.org/wsdl/'> 

<message name='getPortfolioByNameRequest'> 
    <part name='portfolioName' type='xsd:string'/> 
</message> 
<message name='getPortfolioByNameResponse'> 
    <part name='Result' type='xsd:string'/> 
</message> 


<message name='getPortfoliosAllRequest'> 
    <part name='portfolioName' type='xsd:string'/> 
</message> 
<message name='getPortfoliosAllResponse'> 
    <part name='Result' type='xsd:array'/> 
</message> 


<message name='APIValidateRequest'> 
<part name='apiKey' type='xsd:string'/> 
</message> 
<message name='APIValidateResponse'> 
<part name='testReturn' type='xsd:string'/> 
</message> 



<portType name='PortfolioLookupPortType'> 

    <operation name='getPortfolioByName'> 
    <input message='tns:getPortfolioByNameRequest'/> 
    <output message='tns:getPortfolioByNameResponse'/> 
    </operation> 

    <operation name='getPortfoliosAll'> 
    <input message='tns:getPortfoliosAllRequest'/> 
    <output message='tns:getPortfoliosAllResponse'/> 
    </operation> 

    <operation name='APIValidate'> 
    <input message='tns:APIValidateRequest'/> 
    <output message='tns:APIValidateResponse'/> 
    </operation> 

</portType> 

<binding name='PortfolioLookupBinding' type='tns:PortfolioLookupPortType'> 

    <soap:binding style='rpc' 
    transport='http://schemas.xmlsoap.org/soap/http'/> 


    <operation name='getPortfolioByName'> 
    <soap:operation soapAction='urn:PortfolioLookup#getPortfolioByName'/> 
    <input> 
     <soap:body use='encoded' namespace='urn:PortfolioLookup' 
     encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/> 
    </input> 
    <output> 
     <soap:body use='encoded' namespace='urn:PortfolioLookup' 
     encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/> 
    </output> 
    </operation> 


    <operation name='getPortfoliosAll'> 
    <soap:operation soapAction='urn:PortfolioLookup#getPortfoliosAll'/> 
    <input> 
     <soap:body use='encoded' namespace='urn:PortfolioLookup' 
     encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/> 
    </input> 
    <output> 
     <soap:body use='encoded' namespace='urn:PortfolioLookup' 
     encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/> 
    </output> 
    </operation> 




</binding> 

<service name='PortfolioLookupService'> 

    <port name='PortfolioLookupPort' binding='PortfolioLookupBinding'> 
    <soap:address location='http://mysite.com/php5soap/portfolio-lookup-server.php'/> 
    </port> 

</service> 

</definitions> 
Cuestiones relacionadas