Curl, NuSoap, PHP, говорящий с ошибкой аутентификации сервера Exchange - PullRequest
0 голосов
/ 06 марта 2012

У меня есть PHP-скрипт, который использует NuSOAP с curl для использования веб-сервисов Exchange. У меня это работало довольно хорошо, разговаривая с немного более старой версией exchange, а также Exchange 2010.

Совсем недавно мы обновили ОС на сервере, который обновил множество пакетов. С тех пор код Exchange не работает. Он все еще работает со старым сервером, но вообще не взаимодействует с сервером Exchange 2010.

Возвращается сообщение об ошибке «Ошибка аутентификации HTTP.»

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

Кажется странным, что он все еще работает со старым сервером Exchange.

Сказано не проверять ssl-сертификаты, так как они самозаверяющие из-за того, что сейчас являются тестовыми машинами, поэтому я не думаю, что это ошибка проверки сертификата. Я могу аутентифицировать и просматривать веб-сервис на сервере Exchange через браузер, поэтому я знаю, что он все еще активен.

Сервер - это сервер Ubuntu, который был только что обновлен до 10.04.4.

Это фрагмент кода, который работал и работает со старым сервером Exchange.

    $client = new nusoap_client($webservice_wsdl, true);
$client->setCredentials($exch_user, $exch_pass, 'ntlm');
$client->setUseCURL(true);
$client->useHTTPPersistentConnection();
    $client->setCurlOption(CURLOPT_HTTPAUTH, CURLAUTH_NTLM);
$client->setCurlOption(CURLOPT_USERPWD, $exch_user.':'.$exch_pass);
$client->setCurlOption(CURLOPT_SSL_VERIFYPEER, false);
$client->setCurlOption(CURLOPT_SSL_VERIFYHOST, false);
$client->soap_defencoding = 'UTF-8';

$xml = '<FindItem xmlns="http://schemas.microsoft.com/exchange/services/2006/messages"';
$xml .= ' xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" Traversal="Shallow">';
$xml .= '   <ItemShape>';
$xml .= '       <t:BaseShape>IdOnly</t:BaseShape>';
$xml .= '       <t:AdditionalProperties>';
$xml .= '           <t:FieldURI FieldURI="message:From"/>';
$xml .= '           <t:FieldURI FieldURI="item:Subject"/>';
$xml .= '           <t:FieldURI FieldURI="message:IsRead"/>';
$xml .= '           <t:FieldURI FieldURI="item:DateTimeReceived"/>';
$xml .= '           <t:FieldURI FieldURI="calendar:Start"/>';
$xml .= '           <t:FieldURI FieldURI="calendar:End"/>';
$xml .= '           <t:FieldURI FieldURI="calendar:Location"/>';
$xml .= '           <t:FieldURI FieldURI="task:Status"/>';
$xml .= '           <t:FieldURI FieldURI="task:DueDate"/>';
$xml .= '       </t:AdditionalProperties>';
$xml .= '   </ItemShape>';
$xml .= '   <IndexedPageItemView Offset="'.$position.'" MaxEntriesReturned="5" BasePoint="Beginning"/>';
$xml .= '   <ParentFolderIds>';
$xml .= '       '.$fxml;
$xml .= '   </ParentFolderIds>';
$xml .= '</FindItem>';

$result = $client->call('FindItem', utf8_encode($xml));

Ответы [ 2 ]

1 голос
/ 26 июля 2012
<code>You can get nusoap classes with samples see below url

http://sourceforge.net/projects/nusoap/

Try This

<?php
/*
 *  $Id: wsdlclient3b.php,v 1.1 2004/06/15 15:38:29 snichol Exp $
 *
 *  WSDL client sample.
 *
 *  Service: WSDL
 *  Payload: rpc/encoded (params as an XML string; cf. wsdlclient3.php)
 *  Transport: http
 *  Authentication: none
 */
require_once('../lib/nusoap.php');
$proxyhost = isset($_POST['proxyhost']) ? $_POST['proxyhost'] : '';
$proxyport = isset($_POST['proxyport']) ? $_POST['proxyport'] : '';
$proxyusername = isset($_POST['proxyusername']) ? $_POST['proxyusername'] : '';
$proxypassword = isset($_POST['proxypassword']) ? $_POST['proxypassword'] : '';
$client = new soapclient('http://www.scottnichol.com/samples/hellowsdl2.php?wsdl', true, $proxyhost, $proxyport, $proxyusername, $proxypassword);
$err = $client->getError();
if ($err) {
    echo '<h2>Constructor error</h2><pre>' . $err . '
'; } $ params = ' <имя xsi: type = "xsd: string"> Вилли 22 * ​​1002 * <пол XSI: тип = "XSD: строка"> мужской '; $ result = $ client-> call ('hello', $ params); // Проверка на неисправность if ($ client-> fault) { echo '

Fault

';
    print_r($result);
    echo '
'; } еще { // Проверка на ошибки $ err = $ client-> getError (); if ($ err) { // Показать ошибку echo '

Error

' . $err . '
'; } еще { // Показать результат echo '

Результат

';
        print_r($result);
        echo '
'; } } echo '

Запрос

' . htmlspecialchars($client->request, ENT_QUOTES) . '
'; echo '

Response

' . htmlspecialchars($client->response, ENT_QUOTES) . '
'; echo '

Debug

' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '
'; ?>
0 голосов
/ 26 июля 2012

Я думаю, что нашел проблему - по крайней мере, в отношении ее устранения. В какой-то момент должно было произойти обновление (либо для Windows, либо для Unix), которое лишило возможности правильной связи через NTLM.

Мой сервер использует curl версии 7.21. У меня был Linode, который также использовал 7.21, но так как я могу играть с этим, я обновил curl (с SSL) до версии 7.26, которая обеспечивает поддержку NTLMv2 (что-то, чего не было в 7.21). Согласно единственному сайту, который я нашел, чтобы помочь с этой информацией, по-видимому, версия 7.25 также работала: http://blog.ianty.com/ubuntu/exchange-web-services-ews-ntlmv2-and-linux/

Я отвечаю здесь как ответ, но не могу однозначно сказать, что на самом деле это ответ . Это хотя бы один из возможных ответов.

...