2010-04-29 20 views

Odpowiedz

8

Łatwiejszym sposobem byłoby uwierzytelnienie w pierwszym zapytaniu, skompilowanie rekordu sesji po stronie serwera zawierającego zdalny adres IP i tokenu, który dajesz klientowi jako authToken. Następnie pozwól klientowi przekazać ten authToken w przyszłych kwerendach. Ten authToken musi się zgadzać z wewnętrznymi danymi sesji dotyczącymi klienta, ale pozwoliłby ci uniknąć konieczności robienia w obie strony bazy danych tylko po to, aby wykonać uwierzytelnianie.

To powiedziawszy, @Marcus Adams ma dobry punkt poniżej w odniesieniu do bezpaństwowości. Są ludzie, którzy pchają wszelkiego rodzaju SOAP security models. WS-Security to aktualny stan wiedzy, tutaj. Wszystkie one działają, umieszczając informacje uwierzytelniające w nagłówku SOAP - w końcu dlatego komunikat SOAP zawiera zarówno nagłówek, jak i część ciała.

+1

To jest zwykły sposób, o ile wiem. Umożliwiłoby to również zaszyfrowanie punktu końcowego za pomocą protokołu SSL (w celu uzyskania klucza) i użycie niezaszyfrowanych punktów końcowych dla żądań danych (jeśli oczywiście dane mogą być wysyłane bez ochrony). – extraneon

2

Posiadanie przez użytkownika nazwy użytkownika i hasła przy każdym żądaniu to sposób, w jaki widziałem zaimplementowane większość interfejsów SOAP. Właściwie nie widziałem innej implementacji niż pomysł klucza API, który jest po prostu handlowaniem nazwą użytkownika i hasłem dla innego tokena.

Interfejsy SOAP powinny być bezpaństwowcami, podobnie jak HTTP, więc wydaje się to normalną konsekwencją.

2

Należy zdefiniować niestandardowe dane uwierzytelniające nagłówek SOAP i wymieniać się uwierzytelnieniami w nagłówku. Odczytaj wartości z nagłówka i uwierzytelnij.

0

Oto prosty przykład jak używam walidacji API w nagłówku:

plików portfel-lookup-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>'; 

    } 

?> 

plik portfel-lookup-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(); 

?> 

plik portfel-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> 
Powiązane problemy