Services web D'échange d'accès avec PHP et cURL

Bonjour,

je suis en train d'écrire un client pour accéder à un serveur Microsoft Exchange et lire contacts, rendez-vous etc. à partir d'elle.

au fil des jours de recherche, j'ai pu me connecter à L'EWS via le client Soap de PHP et un wrapper de flux HTTPS personnalisé. site m'a beaucoup aidé à ce point.

tout a bien fonctionné sur ma machine Windows 7 en utilisant XAMPP

maintenant j'ai envoyé mon projet dans une version de Debian 6.0 Squeeze machine de développement qui a exactement la même configuration que ma machine Windows en ce qui concerne le serveur web, les paramètres php, les paramètres mysql, etc. mais il juste ne travail plus

la machine debian peut résoudre et pinguer le serveur d'échange sans problèmes

j'ai cloué le problème réel vers le bas à un point, où cURL n'est pas en mesure de récupérer le fichier WSDL de L'EWS

il reçoit toujours une réponse vide et un code d'état 401 (non autorisé)

Le les informations d'identification que j'utilise sont correctes, les mêmes informations d'identification fonctionnent sur ma machine windows

j'ai extrait le code défectueux et essayé de l'exécuter seul, il ressemble à ceci:

    echo "Trying to get https://".$cfg[ 'Exchange.Server' ]."/EWS/Services.wsdl<br>";
    $curl = curl_init( 'https://'.$cfg[ 'Exchange.Server' ].'/EWS/Services.wsdl' );
    curl_setopt( $curl, CURLOPT_RETURNTRANSFER,     true );
    curl_setopt( $curl, CURLOPT_HTTP_VERSION,       CURL_HTTP_VERSION_1_1 );
    curl_setopt( $curl, CURLOPT_HTTPAUTH,           CURLAUTH_NTLM );
    curl_setopt( $curl, CURLOPT_USERPWD,            $cfg[ 'Exchange.User' ].':'.$cfg[ 'Exchange.Password' ] );
    curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER,     false );
    curl_setopt( $curl, CURLOPT_SSL_VERIFYHOST,     false );

    echo '<pre>';
    $response = curl_exec( $curl );
    $info = curl_getinfo( $curl );

    var_dump( $info );
    var_dump( $response );

    curl_close( $curl );

le résultat que je reçois ici est le code d'état 401 mentionné et une réponse vide Quand j'appelle la même url dans mon navigateur ou avec le même code sur ma machine windows, je reçois le fichier WSDL que je veux

en fait, je ne peux même pas dire si c'est un problème basé sur linux ou si c'est le cas quelque chose ne va pas à un moment donné, j'ai du mal avec ça pendant 2 jours maintenant.

y a-t-il quelqu'un qui pourrait trouver mon erreur ou me dire la raison pour laquelle elle ne fonctionne pas?

je peux fournir toute l'information nécessaire sur demande

12
demandé sur DarkDevine 2011-10-05 20:00:50

3 réponses

si vous initialisez correctement votre client soap, vous devriez être en mesure de préformer toutes les requêtes de cette façon:

$curl = curl_init($location); //'https://'.$server_address.'/EWS/Exchange.asmx'
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); //valid soap headers with keep-alive
curl_setopt($ch, CURLOPT_POST, true );
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_USERPWD, $user.':'.$password);
$response = curl_exec($curl);

de votre code, essayez de commenter la ligne suivante:

curl_setopt( $curl, CURLOPT_HTTPAUTH, CURLAUTH_NTLM );

jetez également un oeil partout où ce wrapper fonctionne sur votre installation: http://ewswrapper.lafiel.net/ Si c'est le cas, jetez un oeil aux classes SOAP utilisées là - bas-il utilise php intégré comme base.

pourquoi ne pouvez-vous pas stocker le fichier WSDL localement de toute façon?


mise à jour:

Ok, j'ai joué avec ça dans ma boîte Debian et ça marche parfaitement pour moi:

$domain = 'xxxxxx';
$user = 'xxxxxx';
$password = 'xxxxxx';
$ch = curl_init('https://'.$domain.'/EWS/Services.wsdl'); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_USERPWD, $user.':'.$password);
$response = curl_exec($ch);
$info = curl_getinfo( $ch );
$error =  curl_error ($ch);
print_r(array($response,$info,$error));

retourne

Array
(
    [0] => <?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions 
(...)
</wsdl:definitions>
    [1] => Array
        (
            [url] => xxxxx/EWS/Services.wsdl
            [content_type] => text/xml
            [http_code] => 200
            [header_size] => 250
            [request_size] => 147
            [filetime] => -1
            [ssl_verify_result] => 0
            [redirect_count] => 0
            [total_time] => 0.60574
            [namelookup_time] => 0.165249
            [connect_time] => 0.268173
            [pretransfer_time] => 0.474009
            [size_upload] => 0
            [size_download] => 55607
            [speed_download] => 91800
            [speed_upload] => 0
            [download_content_length] => 55607
            [upload_content_length] => 0
            [starttransfer_time] => 0.580931
            [redirect_time] => 0
            [certinfo] => Array
                (
                )

            [redirect_url] => 
        )

    [2] => 
)
8
répondu Maiiku 2011-10-06 19:30:17

votre première vérification ne doit pas utiliser de scripts complexes. Essayez plutôt d'ouvrir le WDSL à partir d'une simple fenêtre de navigateur sur la machine Debian comme cela: https://your.exchange-server.com/EWS/Services.wsdl

si cela ne fonctionne pas, il y a probablement des restrictions d'accès en place qui dépendent de L'IP du client ou du réseau client (par exemple, votre machine de développement étant dans un réseau de confiance, votre Debian non). Le fait que vous obtenez un 401 ("non autorisé" - demande nécessite l'utilisateur authentification) suggère qu'il n'y a pas de problème pour contacter le serveur, mais pour l'authentification.

une autre vérification que je suggère est que vous ayez un regard dans votre phpinfo() pour vous assurer que votre installation PHP sur Debian est capable de gérer HTTP* S* demandes. Assurez-vous que OpenSSL est installé!

1
répondu Jpsy 2011-10-13 08:50:49

cet article m'a aidé à m'orienter dans la bonne direction. Une chose à garder à l'esprit est que votre installation PHP peut ne pas partager la configuration cURL / libcurl de votre système.

http://blog.ianty.com/ubuntu/exchange-web-services-ews-ntlmv2-and-linux/

1
répondu Jeffery Bennett 2012-07-01 23:19:53