Доступ к веб-сервисам Exchange с помощью PHP и cURL - PullRequest
12 голосов
/ 05 октября 2011

Здравствуйте,

В настоящее время я пишу клиент для доступа к серверу Microsoft Exchange и считывания с него контактов, встреч и т. Д.

За несколько дней поиска я смог подключиться к EWS через PHP-клиент Soap и пользовательскую оболочку HTTPS Stream. Этот веб-сайт очень помог мне в этом.

На моем компьютере с Windows 7 все работало нормально, используя XAMPP

Теперь я загрузил свой проект на компьютер для разработки Debian 6.0 Squeeze, который имеет ту же конфигурацию, что и мой компьютер с Windows, в отношении веб-сервера, настроек php, настроек mysql и т. Д., Но он просто больше не будет работать

Машина Debian может без проблем разрешить и проверить связь с сервером Exchange

Я прибил реальную проблему до такой степени, что cURL не может получить WSDL-файл EWS

Он всегда получает пустой ответ и код состояния 401 (неавторизованный)

Учетные данные, которые я использую, правильные, те же учетные данные работают на моем компьютере с Windows

Я извлек неисправный кусок кода и попытался запустить его в автономном режиме, это выглядит так:

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

В результате я получаю упомянутый код состояния 401 и пустой ответ Когда я вызываю тот же URL в моем браузере или с тем же кодом на моем компьютере с Windows, я получаю файл WSDL, который я хочу

На самом деле, я даже не могу сказать, если это проблема на основе Linux или если я что-то делаю не так, я борюсь с этим в течение 2 дней.

Есть ли кто-то, кто может найти мою ошибку или сказать мне причину, по которой она не работает?

Я могу предоставить любую дополнительную информацию по запросу

Ответы [ 3 ]

8 голосов
/ 06 октября 2011

Если вы правильно инициализируете свой мыльный клиент, вы сможете выполнить любые запросы следующим образом:

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

Что касается вашего кода, попробуйте закомментировать следующую строку:

curl_setopt( $curl, CURLOPT_HTTPAUTH, CURLAUTH_NTLM );

Также посмотрите, где эта оболочка работает в вашей настройке: http://ewswrapper.lafiel.net/ Если это так, взгляните на используемые там классы SOAP - в качестве базы используется встроенный php.

Почему вы не можете хранить файл wsdl локально в любом случае?


UPDATE

Хорошо, я поиграл с этим в своей коробке Debian, и это работает для меня безупречно:

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

возвращает

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] => 
)
1 голос
/ 02 июля 2012

Эта статья помогла направить меня в правильном направлении. Следует иметь в виду, что ваша установка PHP может не делиться настройками cURL / libcurl вашей системы.

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

1 голос
/ 13 октября 2011

Ваша первая проверка не должна использовать сложные сценарии.Вместо этого попробуйте открыть WDSL из простого окна браузера на компьютере Debian, например: https://your.exchange -server.com / EWS / Services.wsdl

Если это не сработает, вероятно, естьсуществуют ограничения доступа, которые зависят от IP-адреса клиента или клиентской сети (например, ваша машина разработки находится в доверенной сети, а Debian - нет).Тот факт, что вы получаете 401 («Неавторизованный» - запрос требует аутентификации пользователя), говорит о том, что нет проблем с подключением к серверу, но с аутентификацией.

Еще одна проверка, которую я предлагаю, заключается в том, что вы заглянули в свой phpinfo.() чтобы убедиться, что ваша установка PHP в Debian способна обрабатывать запросы HTTP * S *.Убедитесь, что OpenSSL установлен!

...