2012-03-06 3 views
0

У меня есть PHP-скрипт, который использует NuSOAP с завиткой, чтобы потреблять веб-службы Exchange. Я работал хорошо, разговаривая с более старой версией обмена, а также с Exchange 2010.Curl, NuSoap, PHP, разговаривающий с ошибкой аутентификации сервера Exchange

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

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

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

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

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

Сервер - это сервер 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)); 
+0

Вы уверены, что ваш Exchange настроен на использование аутентификации NTLM? – Kniganapolke

+0

Да, это было до сих пор и не было изменено. Я проверил это. На серверах обмена ничего не изменилось. – Tim

+0

У меня была такая же проблема, Тим. Удалось ли вам разобраться? К счастью, аутентификация, которую мы использовали, также хранила одностороннюю хэшированную и соленую версию имен пользователей и паролей локально, поэтому люди все еще могут аутентифицироваться, но когда люди меняют свои пароли ActiveDirectory, теперь есть разъединение ... Я обнаружил, что когда я используйте следующий код, кажется, что все работает ... но по иронии судьбы, когда я использую класс ООП, созданный из процедурного кода, это не так. http://stackoverflow.com/a/3998859/155421 Если я найду решение, я обязательно вернусь и опубликую свои выводы. – BrendonKoz

ответ

0

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

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

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

1
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 . '</pre>'; 
} 
$params = '<person xsi:type="tns:Person"><firstname xsi:type="xsd:string">Willi</firstname><age xsi:type="xsd:int">22</age><gender xsi:type="xsd:string">male</gender></person>'; 
$result = $client->call('hello', $params); 
// Check for a fault 
if ($client->fault) { 
    echo '<h2>Fault</h2><pre>'; 
    print_r($result); 
    echo '</pre>'; 
} else { 
    // Check for errors 
    $err = $client->getError(); 
    if ($err) { 
     // Display the error 
     echo '<h2>Error</h2><pre>' . $err . '</pre>'; 
    } else { 
     // Display the result 
     echo '<h2>Result</h2><pre>'; 
     print_r($result); 
     echo '</pre>'; 
    } 
} 
echo '<h2>Request</h2><pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>'; 
echo '<h2>Response</h2><pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>'; 
echo '<h2>Debug</h2><pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>'; 
?>