2010-06-07 4 views
8

J'essaye d'appeler un webservice avec Soap en PHP5, pour cela, j'ai besoin d'utiliser WS-Security 1.1.comment implémenter ws-security 1.1 en php5

(en Java et .NET Tout cela est généré automatiquement.)

Existe-t-il des cadres disponibles pour générer les en-têtes de sécurité facilement en PHP? Ou dois-je ajouter l'en-tête entier moi-même?

Spécifications de WS-Security 1.1: http://oasis-open.org/committees/download.php/16790/wss-1.1-spec-os-SOAPMessageSecurity.pdf

Répondre

12

Sur PHP Classes, Roger Veciana i Rovira a soumis ce (je viens de reformater le code):

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)))); 

     $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#PasswordDigest">'.$passdigest.'</wsse:Password> 
    <wsse:Nonce>'.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($auth,XSD_ANYXML); 
     $header = new SoapHeader("http://docs.oasis-open.org/wss/2004/01/oasis-". 
      "200401-wss-wssecurity-secext-1.0.xsd", "Security", $authvalues, 
       true); 

     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; 
    } 
} 
+0

Je l'ai remarqué est pour la version 1.0, mais J'espère que ça vous mettra sur la bonne voie. – Artefacto

+0

Merci de répondre, maintenant j'ai l'exception suivante exception SoapFault Uncaught: [HTTP] ne peut pas traiter le message parce que le type de contenu 'text/xml; charset = utf-8 'n'était pas le type attendu' application/soap + xml; jeu de caractères = utf-8 '. dans /home/projects/caheritage/site/providence/app/lib/core/WSSoapClient.php:80 une idée de comment le résoudre? –

+1

wsHttpBinding (SOAP 1.2) utilise le type de contenu 'application/soap + xml', basicHttpBinding (SOAP 1.1) utilise 'text/xml' alors assurez-vous que PHP et WCF correspondent. ie - assurez-vous que PHP est configuré pour utiliser la bonne version SOAP lors de l'appel d'une liaison basique ou ws dans WCF – Xcalibur