4

だから最初にちょっとした雑学。

ログインしたいユーザーを認証するためにNTLMプロトコルを使用するASP.NETWebサイトに書かれています。通常使用する場合は、WebサイトのURLを入力し、資格情報を提供し、Webブラウザーでセッションを認証および維持します。

私がやりたいのは、ボットとして機能するPHPWebサイトを作成することです。これは私の会社の内部ウェブサイトであり、そうすることを承認されています。私が遭遇した問題は、セッションの管理です。ユーザーは私のPHPWebサイトに自分の資格情報を入力できるようになり、私のPHPWebサイトはcURLを使用してターゲットサイトに対してユーザーを認証します。

これまでに取得したコードは次のとおりです。

    $cookie_file_path = dirname(__FILE__) . '/cookies.txt';
    $ch = curl_init();

    //==============================================================
     curl_setopt($ch, CURLOPT_USERPWD, $username. ':' . $password);
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
     curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
     curl_setopt($ch, CURLOPT_URL, $url);
     curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
     curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
     curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path);
     curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path);
     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
     curl_setopt($ch, CURLINFO_HEADER_OUT, true);
     curl_setopt($ch, CURLOPT_FAILONERROR, 0);
     curl_setopt($ch, CURLOPT_MAXREDIRS, 100);
    //=============================================================
    $ret = curl_exec($ch);

上記のコードは、cURL(NTLMハンドシェイクを管理しているように見えます)によってターゲットWebサイトにログインし、Webサイトのコンテンツをフェッチします。また、Cookieファイルに返送されるセッションIDも保存されます。

次にやろうとしているのはCURLOPT_USERPWD、このスクリプトがCookieファイルに保存されているセッションIDを使用して、このスクリプトの2回目の実行で以前にログインしたユーザーを認証することを期待して、オプションにコメントを付けることです。手動で作成したセッション、データベース、またはその他の場所に保存するのは安全ではないため、ユーザーの資格情報を削除して、その方法で保存しない可能性があります。

ボットはCRONを使用して、Webサイトのステータスが変更されたかどうかを定期的にチェックし、これに対する反応としていくつかのユーザーアクションを実行するため、これが必要です。ただし、これを行うには、最初にユーザーを認証する必要があり、ユーザー名とパスワードをどこにも保存しないようにする必要があります。そのため、ユーザーが最初にログインしたときに確立されたセッション情報を使用する必要があります。

CURLはこれを行わないようです。コメントCURLOPT_USERPWD付きオプションを使用してスクリプトを2回実行すると、保存されているCookieを使用して認証された状態が維持されません。代わりに、NOT AUTHRORISEDアクセス要求への応答として、サービスから送信された関連データを含まないCookieファイルを再書き込みします。

私の質問は次のとおりです。cURLが保存されたセッション情報を使用してビーイングの認証を維持しないのはなぜですか?cURLおよびNTLMプロトコルベースのWebサイトでこのセッションを維持する方法はありますか?

前もって感謝します。

4

2 に答える 2

1

私は同じ問題を抱えておりcurl_setopt($ch, CURLOPT_COOKIEFILE, "");、コード行を使用して解決しました。文字列は完全にでなければなりません。

于 2016-07-05T06:53:27.943 に答える
1

数か月前、私はあなたと同様の問題を抱えていました。navision soap api への接続を取得しようとしました。Navision は ntlm 認証を使用します。問題は、curl が ntlm をネイティブにサポートしていないため、自分で行う必要があることです。

この状況で私を大いに助けたブログ投稿は次のとおりです。

http://rabaix.net/en/articles/2008/03/13/using-soap-php-with-ntlm-authentication

** 編集

すみません、質問を読み違えました。あなたの問題は簡単です。

この行でリクエストからヘッダーを受け取るだけです

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

次に、curl_exec 関数の結果である Set-Cookie ヘッダーを取得できます。

preg_match('/^Set-Cookie:\s*([^;]*)/mi', $ret, $match);
$cookie = parse_url($match[0]);

これで、それをどこかに保存して、2ten リクエストで使用できます。

于 2013-02-27T12:07:55.727 に答える