2

続行する前に明確にしてください。残念ながら、ここではPHPの組み込みSOAPクラスを使用することはできません(本番サーバーのPHPはそれを使用して構築されていないため、構築されません)。


EWSを使用して、完全に外部のサーバーアプリケーションのユーザーを認証できるようにしようとしています。LDAP認証は許可されていません。Microsoftの自動検出ツールであるhttp://www.testexchangeconnectivity.com/を使用して、 EWSwsdlが正しいことを確認しました。WSDLの内容はここで見つけることができます:http://pastebin.org/214070

サーバーはSSLを使用しており、EWSのデフォルトの認証方法である「NTLM」を使用しています。

私はWebでさまざまなコード例を試しましたが、残念ながらXML、SOAP、またはcURL(ここで使用されているテクノロジーのほとんどすべて)に精通していません。私のコードの現在の反復は以下にあります:

<?php

include_once('./lib/nusoap.php');

$username = 'username@example.com';
$password = 'password';
$ews_url  = 'https://owa.example.com/EWS/Exchange.asmx';
$soapclient = new nusoap_client($service, true);
$soapclient->setCredentials($username, $password, 'ntlm');
$soapclient->setUseCurl(true);
$soapclient->useHTTPPersistentConnection();
$soapclient->setCurlOption(CURLOPT_USERPWD, $username.':'.$password);
$soapclient->soap_defencoding = 'UTF-8';

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

$operation = 'FindItem';
$namespace = '';
$soapAction = '';
$headers = false;
$result = $soapclient->call($operation, $params, $namespace, $soapAction, $headers);
echo '<pre>'; print_r($result); echo '</pre>';

if($soapclient->fault){
    echo 'FAULT: ';
    echo '<pre>'; print_r($result); echo '</pre>';
}else{
    $err = $soapclient->getError();
    if ($err) {
        echo '<p><b><u>Error</u>:</b><br />' . $err . '</p>';
    }else{
        echo 'Connection succeeded.';
    }
}
?>

私が抱えている実際の問題は、NuSOAPが「WSDLドキュメントに操作が定義されていません!」という一般的なエラーメッセージを返すことです。WSDLの外観からは、これは正しくないように思われ、コードに何かが欠けていると思われます。コード($ soapclient-> call(...))で実際のクライアント呼び出しを削除すると、コードは「接続に成功しました。」と出力しますが、試行されたNTLM認証コードの有無にかかわらずこれを実行します。

また、開発マシンで「php-ews」プロジェクトを使用しようとしましたが(同じコードは本番サーバーでは機能しませんが)、エラーを受け取らずに何にもアクセスできませんでした。

誰かがこれらの技術のいずれかについての経験があり、いくつかの説明(または起こりうるエラー)を指摘できるかもしれないなら、私はそれを大いに感謝します。私の側でさらに説明が必要な場合は、私に知らせてください。

更新1: WSDLをロードする際のエラーの1つは、NTLM認証のようです。cURLのみ(NuSOAPなし)を使用して、WSDLファイルにアクセスし、サーバーが別のエンドポイントの場所(... / EWS / Services.wsdl)にリダイレクトしていることを確認できました。

残念ながら、NuSOAPライブラリのcURL機能を使用し、NuSOAPを介して同じオプションを設定しようとしましたが、NuSOAPがWSDLファイルを表示/表示/アクセスできない場合と同じ一般的なエラーメッセージが表示されます。NuSOAPクライアントコードがすぐにエラーメッセージを返すのに対し、cURLバージョンが戻るまでに少し時間がかかるため(NTLMはマルチステップハンドシェイクプロセス)、NTLM認証である可能性があります。

4

1 に答える 1

2

ここで見ていただきたいことがいくつかあります。

  1. 実際の soap_client への呼び出しにエラーがあります。$ews_url という変数でエンドポイントを定義しましたが、$service でコンストラクターを呼び出しました。

  2. $xml 変数の文字列に文字列を追加するのはなぜですか?おそらく急いで、代わりに連結するつもりでしたか? (演算子: + 対 .)

  3. Java で EWS を操作するための次の Wiki 情報を使用すると、Microsoft は共通プロトコルの実装で再び失敗したようです。この Wiki の types.xsd の変更は実際には問題を引き起こすため、その変更は無視しますが、Services.wsdl のローカル コピーをダウンロードして、自分のサーバーを指すように変更すると、適切に動作するようです。http://www.bedework.org/trac/bedework/wiki/ExchangeWSリンク テキスト

次のコードは、types.xsd、messages.xsd、および Services.wsdl のローカル コピーをダウンロードし、Services.wsdl ファイルを変更してサーバーに関連する必要な情報を追加している限り、機能するはずです。これらのファイルのローカル コピーがサーバー上の同じフォルダーにあることを確認してください。

<?php
    include_once('./lib/nusoap.php');

    $username = 'username@example.com';
    $password = 'password';
    $endpoint = 'http://your.local.version/of/Services.wsdl';
    $wsdl = true;
    $soapclient = new nusoap_client($endpoint, $wsdl);

    $soapclient->setCredentials($username, $password, 'ntlm');

    $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="0" MaxEntriesReturned="5" BasePoint="Beginning"/>';
    $xml .= '   <ParentFolderIds>';
    $xml .= '       <t:DistinguishedFolderId Id="inbox"/>';
    $xml .= '   </ParentFolderIds>';
    $xml .= '</FindItem>';

    $operation = 'FindItem';
    $result = $soapclient->call($operation, $xml);
    echo '<pre>'; print_r($result); echo '</pre>';
?>

解決策はすべて、メインの SOAP 参照ファイルのローカル コピーを用意し、Services.wsdl ファイルを修正することから生じるようです。Exchange サーバーにアクセスできる場合は、Services.wsdl ファイルを変更できる可能性があり、このような手間をかけずにすべてが期待どおりに機能していた可能性があります。残念ながら、これを確認することはできません。

于 2010-10-22T16:23:16.930 に答える