Автор Тема: Zend_Soap and WS-Security  (Прочитано 3703 раз)

0 Пользователей и 1 Гость смотрят эту тему.

Оффлайн ipartemk

  • Опытный
  • ***
  • Сообщений: 89
  • Карма: 2
Zend_Soap and WS-Security
« : Август 20, 2010, 10:55:45 »
Коллеги, столкнулся с проблемой написания клиента Zend_Soap с использованием WS-Security.
Найти внятную информацию в гугле не удалось, поэтому прошу помочь вас.
Если кто-то уже делал такое, поделитесь примером простенького клиента. Обращаю внимание на WS-Security

Оффлайн ipartemk

  • Опытный
  • ***
  • Сообщений: 89
  • Карма: 2
Re: Zend_Soap and WS-Security
« Ответ #1 : Август 20, 2010, 12:01:11 »
Если Zend не поддерживает WS-Security, подскажите PHP библиотеку, что поддерживает.

Оффлайн ipartemk

  • Опытный
  • ***
  • Сообщений: 89
  • Карма: 2
Re: Zend_Soap and WS-Security
« Ответ #2 : Июнь 21, 2011, 09:01:49 »
нашел свое старое сообщение без ответа, напишу как я тогда решил задачу


/**
  Use Example: 
  include('WsSoapClient.php');
  $url = "the WSDL address";
  $client = new WsSoapClient($url);
  $client->__setUsernameToken('user','passw');
  $params=array(); //Put the service parameters here
  $result=$client->__soapCall('method_name',$params);
  print_r($result);//The easyest way to see the result.
 */


class WsSoapClient extends SoapClient{
    private 
$username;
    private 
$password;

    
/*Generates de WSSecurity header*/
    
private function wssecurity_header(){

        
//The timestamp. The computer must be on time or the server you are connecting may reject the password digest for security.
        
$timestamp  gmdate('Y-m-d\TH:i:s\Z');

        
//A random word. The use of rand() may repeat the word if the server is very loaded.
        
$nonce      mt_rand();
        
        
//This is the right way to create the password digest. Using the password directly may work also, but it's not secure to transmit it without encryption. And anyway, at least with axis+wss4j, the nonce and timestamp are mandatory anyway.
        //$passdigest=base64_encode(pack('H*',sha1(pack('H*',$nonce).pack('a*',$timestamp).pack('a*',$this->password))));
        //$passdigest=base64_encode(sha1($nonce.$timestamp."p1ranha",true));
        
$passdigest $this->password;

        
$auth='
    <wsse:Security SOAP-ENV:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
    <wsse:UsernameToken>
        <wsse:Username>'
.$this->username.'</wsse:Username>
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">'
.$passdigest.'</wsse:Password>
        <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">'
.base64_encode(pack('H*',$nonce)).'</wsse:Nonce>
        <wsu:Created xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">'
.$timestamp.'</wsu:Created>
       </wsse:UsernameToken>
    </wsse:Security>
    '
;

        
//XSD_ANYXML (or 147) is the code to add xml directly into a SoapVar. Using other codes such as SOAP_ENC, it's really difficult to set the correct namespace for the variables, so the axis server rejects the xml.
        
$authvalues = new SoapVar($authXSD_ANYXML);
        
$header     = new SoapHeader("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd""Security"$authvaluestrue);

        return 
$header;
    }

    
/**
     * It's necessary to call it if you want to set a different user and password
     */
    
public function __setUsernameToken($username$password)
    {
        
$this->username $username;
        
$this->password $password;
    }


    
/**
     * Overwrites the original method adding the security header. As you can see, if you want to add more headers, the method needs to be modifyed
     */
    
public function __soapCall($function_name,$arguments,$options=null,$input_headers=null,$output_headers=null)
    {
        
$result parent::__soapCall($function_name,$arguments,$options,$this->wssecurity_header());

        return 
$result;
    }

}



$this
->_wsSoapClient    = new WsSoapClient($url);
$this->_wsSoapClient->__setUsernameToken("mysite.com""password");
$result $this->_wsSoapClient->__soapCall('getOpportunityDetail'$params);

Оффлайн hnoor0044

  • Новичок
  • *
  • Сообщений: 1
  • Карма: 0
Re: Zend_Soap and WS-Security
« Ответ #3 : Март 19, 2016, 16:03:31 »
спасибо за обмен информацией