Accedere ai Servizi Web Exchange con PHP e cURL

Ciao,

Attualmente sto scrivendo un client per accedere a un server Microsoft Exchange e leggere contatti, appuntamenti, ecc. da esso.

Nei giorni di ricerca ho stato in grado di connettersi al server web incorporato in via di PHP client Soap e personalizzato HTTPS Flusso wrapper. Questo sito mi ha aiutato molto a questo punto.

Tutto ha funzionato bene sul mio Windows 7 utilizzando XAMPP

Ora ho caricato il mio progetto di Debian 6.0 Squeeze macchina di sviluppo, che ha esattamente la stessa configurazione della mia macchina Windows per quanto riguarda il web-server, le impostazioni php, mysql, ecc. ma semplicemente non funziona più

La macchina debian può risolvere e ping il server senza problemi

Ho inchiodato il problema effettivo fino a un punto, dove cURL non è in grado di recuperare il file WSDL dell’EWS

Si riceve sempre una risposta vuota e un 401 (non autorizzato) codice di stato

Le credenziali che uso sono corrette, le stesse credenziali di lavorare sulla mia macchina windows

Ho estratto il pezzo difettoso di codice e provato a fare funzionare stand-alone, assomiglia a questo:

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

Il risultato ricevo qui è citato 401 codice di stato e una risposta vuota
Quando chiamo lo stesso url del mio browser o con lo stesso codice sulla mia macchina windows, ho il file WSDL voglio

Effettivamente anche io non riesco a capire se questo è basato su linux problema o se faccio qualcosa di sbagliato, a un certo punto, sto lottando con questo per 2 giorni ora.

C’è qualcuno che potrebbe essere in grado di trovare un mio errore o di dirmi il motivo per cui non funziona?

Posso fornire eventuali ulteriori informazioni necessarie su richiesta

  • Hai provato a prendere il file dalla riga di comando, come pure, ad esempio, con la curl strumento a riga di comando? Si può rivelare un sacco di informazioni.
  • Sì, ho provato la stessa cosa utilizzando lo strumento della riga di comando “curl” utilizzando i parametri -k (ignorare voci certs), –ntlm (NTLM auth) e -u per il mio credenziali utente ho ricevuto una risposta vuota
  • Abilitare l’output dettagliato, penso che sia -v, controllare contro --help. Ci sono alcuni altri “debug” opzioni per certs etc. IIRC.
  • Sembra essere qualcosa con NTLM libreria sul client….
  • Io non uso nessuna NTLM libreria in questo caso, cURL ha integrato l’autenticazione NTLM -v mi indicò un errore che ho fatto, che stava usando invece \\ di \ come il mio dominio separatore per il nome utente, però, ho ancora la risposta 401
  • Ciao @DarkDevine ha risolto?

InformationsquelleAutor DarkDevine | 2011-10-05

 

3 Replies
  1. 8

    Se si inizializza il client soap correttamente, si dovrebbe essere in grado di preforme eventuali richieste richieste in questo modo:

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

    Come per il codice, prova a impostare come commento la riga seguente:

    curl_setopt( $curl, CURLOPT_HTTPAUTH, CURLAUTH_NTLM );

    Anche dare un’occhiata ovunque questo wrapper lavori di installazione di:
    http://ewswrapper.lafiel.net/
    Se lo fa, guarda SAPONE classi vi – utilizza php integrato come base.

    Perché non si può archiviare file wsdl localmente comunque?


    AGGIORNAMENTO:

    Ok, ho giocato con questa mia Debian box e questo per me funziona perfettamente:

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

    restituisce

    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] => 
    )
    • Grazie per la tua risposta. Scusa, credo di non notare abbastanza bene, ma questo non è esattamente il SAPONE non essere in grado di recuperare il file WSDL, cURL non è. Io non riesco a memorizzare localmente, poiché non siamo sicuri se si può o non può essere modificato, il progetto verrà eseguito in più ambienti. Un’alternativa per me era il download con cURL e poi dare la versione locale di SAPONE, ma questo è già il problema. Semplicemente, non posso scaricare il file WSDL con arricciatura su Linux. L’autenticazione NTLM è richiesto da Microsoft Exchange dal modo in cui
    • Hai provato a commentare la riga con HTTPAUTH? Anche se, tecnicamente, NTLM auth è richiesto da MS Ex, a volte saltando che in curl esecuzione fa il trucco. Per scaricare wsdl da Ex server in realtà ho un ciclo attraverso tutti i auth tipi e vedere quale restituisce file wsdl e utilizzare quella per la connessione al server. Sarete sorpresi di vedere che i vari MS Ex server è possibile utilizzare diverse auth tipi.
    • Ho già provato a commentare fuori, non funziona. Ho anche provato tutti i metodi di autenticazione cURL fornisce la sicurezza, senza fortuna. Funziona ancora con lo stesso codice sulla mia macchina windows, quindi probabilmente non è un server-side, ma il lato client problema
    • Ho provato il tuo codice e ho provato il tuo codice con qualche ritocco qua e là, ho il 401. Quando ho messo l’autenticazione NTLM, ho ottenere un buon risultato sulla mia macchina windows, però, ancora nulla sulla mia Debian. Grazie per il vostro aiuto con il modo in
    • Che strano, il codice che ho postato funziona con il mio cambio sulla mia Debian box. Forse provare diverse linux box, dato che su win box funziona. Come per NTLM auth – cambio sto usando richiede sotto windows, ma non come sulla mia Debian. In alternativa, se siete in python, si potrebbe anche voler provare a scaricare wsdl utilizzando urllib2 + ntml e ciclo attraverso tutti i metodi di autenticazione verifica quali restituire 401 – prerhaps il problema sta nella versione di php/curl
    • Per tutti coloro che hanno problemi – sono stato in grado di utilizzare questa risposta, ma ho dovuto includere curl_setopt( $curl, CURLOPT_HTTPAUTH, CURLAUTH_NTLM );. Non avendo che la linea mi ha dato 401 del

  2. 1

    Vostra prima visita di controllo non deve utilizzare gli script complessi.
    Invece, provare ad aprire la WDSL da una semplice finestra del browser sulla macchina Debian in questo modo:
    https://your.exchange-server.com/EWS/Services.wsdl

    Se non funziona, probabilmente ci sono restrizioni di accesso in luogo, che dipendono l’IP del client o client di rete (ad esempio, computer di sviluppo di essere in una rete di fiducia, Debian non). Il fatto che si ottiene un 401 (“non autorizzato” – richiesta richiede l’autenticazione dell’utente) suggerisce che non c’è nessun problema con la connessione al server, ma con l’autenticazione.

    Un altro controllo che suggerisco è che si dispone di uno sguardo il phpinfo() per assicurarsi che la tua installazione di PHP su Debian è in grado di gestire HTTP*S* richieste. Assicurarsi, è installato OpenSSL!

    • HTTPS wrapper esiste, OpenSSL installato, il browser non su Debian, ma provato wget e curl da riga di comando wget con 403 (Ovviamente), curl ottiene 401, ho provato tutti i tipi di username e password combinazioni, con e senza dominio, da 1 a 4 barre rovesciate come separatore dominio, IP o restrizioni di client attivi
    • Da quello che ho trovato sul web potrebbe essere un problema con NTML v2 (ovviamente accettati solo ed esclusivamente dai server di Exchange) e NTML v1 (offerto da client Linux). Ci sembrano essere comuni negoziazione i problemi tra i due mondi, anche se entrambi hanno il supporto v2. Questo non risponde alla tua domanda, ma forse i suggerimenti nella giusta direzione per ulteriori test.

Lascia un commento