douhuireng4407 2015-06-12 08:51
浏览 116
已采纳

如何使用SOAP Header和PHP进行身份验证?

I look for an example of Web service's creation using an authentification SOAP header and PHP. I found an acticle on http: // stackoverflow.com with a code given by EricP in an answer to a question below:

How to do authentication using SOAP?

I don't know why it does not work. It seems to me that the program does not pass in the function APIValidate which is supposed to verify the authenticity of the APIKey. What is what you would know why it does not work?

I found other examples of code using the same principle and I always block in the same place. I use in localhost Wamp and PHP version 5.2.3. Does it exist a particular module to be activated in wamp or Apache or PHP?

Thank you in advance for your answers.

Here is my code:

file portfolio-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){

    return "------>>>auth=".$auth->apiKey.'<br />'."apikey".$this->apiKey."<br />";
  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();
?>

file portfolio-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"; 
$apiKey = "125456"; 
$url = 'http://localhost/WebservicePortfolio/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>
"; print "Request :
".htmlspecialchars($client->__getLastRequest()) ."
";
    print "Response:
".htmlspecialchars($client->__getLastResponse())."
"; print "</pre>";   
    print_r($auth);
    print_r($header);

  } catch (SoapFault $exception) {

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

  }

?>

file portfolio-lookup.wsdl

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

<definitions name='PortfolioLookup'

  targetNamespace='http://localhost/WebservicePortfolio'

  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://localhost/WebservicePortfolioportfolio-lookup-server.php'/>
  </port>

</service>

</definitions>
  • 写回答

1条回答 默认 最新

  • dream0614 2015-06-15 06:57
    关注

    I found the solution.

    You should declare the function APIValidate in the binding in the file wsdl.

    <operation name='APIValidate'>
        <soap:operation soapAction='urn:PortfolioLookup#APIValidate'/>
        <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>  
    

    And you should déclare in type array the input request in part message.

    <message name='APIValidateRequest'>
    <part name='apiKey' type='xsd:array'/>
    </message>
    

    Above the code final:

    file portfolio-lookup.wsdl

    <?xml version ='1.0' encoding ='UTF-8' ?>
    
    <definitions name='PortfolioLookup'
    
      targetNamespace='http://localhost/WebservicePortfolio'
    
      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:array'/>
    </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>  
    
    
     <operation name='APIValidate'>
        <soap:operation soapAction='urn:PortfolioLookup#APIValidate'/>
        <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://localhost/WebservicePortfolio/portfolio-lookup-server.php'/>
      </port>
    
    </service>
    
    </definitions>
    

    file portfolio-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://localhost/WebservicePortfolio/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>
    "; print "Request :
    ".htmlspecialchars($client->__getLastRequest()) ."
    ";
        print "Response:
    ".htmlspecialchars($client->__getLastResponse())."
    "; print "</pre>";   
         echo "<br />================================auth====================<br />";
        print_r($auth);
        echo "<br />================================header====================<br />";
        print_r($header);
         print "<br />-------------->>>Request last header:
    ".htmlspecialchars($client->__getLastRequestHeaders())."
    ";
    
      } catch (SoapFault $exception) {
    
        echo 'Exception Thrown: '.$exception->faultstring.'<br><br>';  
    
      }
    
    ?>
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度