web-dev-qa-db-fra.com

WSDL à PHP avec l'authentification de base

J'ai besoin de construire des classes php à partir d'un WSDL qui est derrière l'authentification de base.

Il a des tonnes d'espaces de noms, il est donc fastidieux de le faire à la main.

J'ai essayé quelques outils, mais il semble que la session d'authentification n'est pas persistante.

11
BigPoppa
$options = array(
     'login' => $username,
     'password' => $password,
);
$client = new SoapClient($wsdl, $options);

Oui cela fonctionne! J'ai essayé une solution que je construisais et qui se connecte à mon client WS qui est avec HTTP Basic Auth.

18
aemerich

L'authentification HTTP fonctionne avec le client SOAP, mais vous ne pouvez pas accéder aux fichiers WSDL protégés par mot de passe.

Voir https://bugs.php.net/bug.php?id=27777

5
Ridgway

En utilisant le client SOAP intégré, vous devriez avoir quelque chose comme ceci:

$options = array(
    'login' => $username,
    'password' => $password,
);
$client = new SoapClient($wsdl, $options);
3
nutrija

J'ai résolu ce problème en utilisant lib nusoap . Voir si ça aide

$params = array(
  "param" => "value"
);

$soap_client = new nusoap_client($wsdl_url, true);
$soap_client->setCredentials(USER_SERVICE, PASS_SERVICE, 'basic');
$soap_client->soap_defencoding = 'UTF-8'; //Fix encode erro, if you need
$soap_return = $soap_client->call("method_name", $params);
1
Liko

Que diriez-vous de cette solution:

  1. Téléchargez le WSDL et sauvegardez-le dans un fichier local
  2. Créer SoapClient avec le fichier local

Quelque chose comme ça (dans une version simplifiée):

class MySoap {

    private $WSDL = 'https://secure-wsdl.url?wsdl';

    private $USERNAME = 'dummy';
    private $PASSWORD = 'dummy';

    private $soapclient;

    private function localWSDL()
    {
        $local_file_name = 'local.wsdl';
        $local_file_path = 'path/to/file/'.$local_file_name;

        // Cache local file for 1 day
        if (filemtime($local_file_path) < time() - 86400) {

            // Modify URL to format http://[username]:[password]@[wsdl_url]
            $WSDL_URL = preg_replace('/^https:\/\//', "https://{$this->USERNAME}:{$this->PASSWORD}@", $this->WSDL);

            $wsdl_content = file_get_contents($WSDL_URL);
            if ($wsdl_content === FALSE) {

                throw new Exception("Download error");
            }

            if (file_put_contents($local_file_path, $wsdl_content) === false) {

                throw new Exception("Write error");
            }
        }

        return $local_file_path;
    }

    private function getSoap()
    {
        if ( ! $this->soapclient )
        {
            $this->soapclient = new SoapClient($this->localWSDL(), array(
                'login'    => $this->USERNAME,
                'password' => $this->PASSWORD,
            ));
        }

        return $this->soapclient;
    }

    public function callWs() {

        $this->getSoap()->wsMethod();
    }
}

Ça marche pour moi :)

1
Briganti

Ceci est un exemple simple d'authentification de webservice à l'aide de soapClient

$apiauth =array('UserName'=>'abcusername','Password'=>'xyzpassword','UserCode'=>'1991');
$wsdl = 'http://sitename.com/service.asmx?WSDL';
$header = new SoapHeader('http://tempuri.org/', 'AuthHeader', $apiauth);
$soap = new SoapClient($wsdl); 
$soap->__setSoapHeaders($header);       
$data = $soap->methodname($header);        

Ce code analyse en interne l'en-tête comme suit 

<soap:Header>
    <AuthHeader xmlns="http://tempuri.org/">
      <UserName>abcusername</UserName>
      <Password>xyzpassword</Password>
      <UserCode>1991</UserCode>
    </AuthHeader>
</soap:Header>
0
Hina Vaja

j'ai essayé de résoudre ce problème, mais d'après ce que j'ai compris, les connexions client de savon aux services Web ssl + httpauth sont plus pénibles. J’ai cherché sur Google et, d’après ce que j’ai compris, une fois mon problème résolu, vous pouvez également utiliser l’exemple ci-dessous pour résoudre votre problème (en utilisant les informations HttpAuth dans les configurations url et soapClient).

$username="test";
$password="test";
$url = "https://".urlencode($username).":".urlencode($password)."@example.com/service.asmx?WSDL";

$context = stream_context_create([
'ssl' => [
// set some SSL/TLS specific options
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true,
]]);

$client = new SoapClient($url, [
'location' => $url,
'uri' => $url,
'stream_context' => $context,
'login' => $username,
'password' => $password
]);

$params=array(
'operation'=>’arguments',
'and’=>'other bull',
'goes’=>'here'
);

$response = $client->__soapCall('OperationName', array($params)); 
0
Kambaa