2009-07-06 6 views
7

Je crée un service web en utilisant les méthodes SOAP natives de PHP5. Tout s'est bien passé jusqu'à ce que j'essaie de gérer l'authentification en utilisant les en-têtes SOAP.Collecte/Traitement des en-têtes dans PHP Soap Server

je pourrais facilement trouver comment ajouter le nom d'utilisateur/mot de passe pour les en-têtes SOAP, côté client:

$myclient = new SoapClient($wsdl, $options); 

$login = new SOAPHeader($wsdl, 'email', 'mylogin'); 
$password = new SOAPHeader($wsdl, 'password', 'mypassword'); 
$headers = array($login, $password); 

$myclient->__setSOAPHeaders($headers); 

Mais je ne trouve nulle part les méthodes de collecte et de traitement de ces en-têtes serveur -side. Je devine qu'il doit y avoir un moyen facile de définir une méthode dans mon SoapServer qui gère les en-têtes ...

Répondre

5

SoapClient utilise le nom d'utilisateur et mot de passe pour implémenter l'authentification HTTP. L'authentification Basic et Digest prend en charge (see source)

Pour plus d'informations sur l'implémentation de l'authentification HTTP en PHP côté serveur, voir this manual page.

Si vous ne souhaitez pas utiliser l'authentification HTTP, consultez this user-contributed sample sur la page de manuel de SoapServer, qui montre comment transmettre des informations d'identification dans un en-tête UsernameToken.

+0

Je suis en train de rattraper les en-têtes en utilisant seulement la bibliothèque SOAP, donc sans authentification HTTP, et j'ai essayé l'échantillon que vous avez mentionné, mais cela ne semble fonctionner que si je n'utilise pas de définition WSDL. WSDL, je vais continuer à chercher, merci de votre contribution tho. – altermativ

+0

Oui, vous devez définir les en-têtes dans le fichier WSDL. – Ant

1

Vous pouvez essayer de lire les données RAW POST.

if ($_SERVER['REQUEST_METHOD'] == 'POST') 
{ 
    $xml = file_get_contents('php://input'); 
    print(htmlspecialchars($xml); 
    // XML processing 
} 

En $ xml, vous aurez toute la requête XML SOAP.

SoapServer ne dispose pas de méthodes pour lire les en-têtes SOAP.

- edit: par exemple contribué de manuel ne semble pas fonctionner, méthode de gestion d'en-tête ne fait jamais appelé

1

Vous devez utiliser une version de PHP. Avec PHP 5.2.4 j'ai eu le même problème, mais avec 5.2.17 ou 5.3.8 le rappel pour le traitement d'en-tête SOAP (décrit dans le samle contributif par l'utilisateur sur php.net) est appelé et tout fonctionne très bien.

5

Avec une version PHP moderne, il est pas nécessaire pour ajouter quoi que ce soit au fichier WSDL car les en-têtes font partie de la spécification SOAP Envelope.

L'utilisateur a contribué par exemple cité par Paul Dixon ne fonctionne tout simplement pas parce que l'en-tête ne UserToken comme écrit dans le commentaire, l'en-tête est Security, de sorte que c'est le nom de la méthode de classe doit avoir. Ensuite, vous obtenez un bel objet stdClass avec une propriété d'objet UserToken stdClass dont le nom d'utilisateur et le mot de passe sont des propriétés.

Exemple de code (à insérer dans une classe PHP qui implémente le service SOAP:

public function Security($header ){ 
     $this->Authenticated = true; // This should be the result of an authenticating method 
     $this->Username = $header->UsernameToken->Username; 
     $this->Password = $header->UsernameToken->Password; 
    } 

fonctionne comme un charme pour nom d'utilisateur/mot de passe basé WSSE Savon sécurité

Questions connexes