2012-10-23 11 views
5

私はナッツを送信している "奇妙な" PHP CURLビヘイビアを見つけました。基本的に私がやっていることは、カールでダイジェスト認証されたコールを作ることです。ここに私のコードの抜粋です:ダイジェスト付きphp curlは2つの応答を返します

curl_setopt($this->c, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); 
curl_setopt($this->c, CURLOPT_USERPWD, $username . ":" . $password); 

それが正常に動作し、メッセージの種類「YES、あなたが正しい資格情報を提供する」と、サーバーが実際に戻ってきます。唯一の問題は、実際のHTTPレスポンスは、実際には1つのレスポンスではなく2つのレスポンスを含むため、ちょっと奇妙です。ここでは、curl_exec何(の$ this - > C)吐き出す:それは、サーバ(それが認証を必要と述べている1)からの最初の応答を含んでいる、なぜ私は得ることはありません

HTTP/1.0 401 Unauthorized 
Date: Tue, 23 Oct 2012 08:41:18 GMT 
Server: Apache/2.2.20 (Ubuntu) 
X-Powered-By: PHP/5.3.6-13ubuntu3.9 
WWW-Authenticate: Digest realm="dynamikrest-testing",qop="auth",nonce="5086582e95104",opaque="4b24e95490812b28b3bf139f9fbc9a66" 
Vary: Accept-Encoding 
Content-Length: 9 
Connection: close 
Content-Type: text/html 

HTTP/1.1 200 OK 
Date: Tue, 23 Oct 2012 08:41:18 GMT 
Server: Apache/2.2.20 (Ubuntu) 
X-Powered-By: PHP/5.3.6-13ubuntu3.9 
Vary: Accept-Encoding 
Content-Length: 9 
Connection: close 
Content-Type: text/html 

"success" 

誰も問題を投げかけてもらえますか?回答の累積を避けるにはどうすればよいですか?あなたは、ヘッダーのために-Iオプションを使用する場合はカールが同じ振る舞いを持っているように見えます

乾杯

+0

の出力の「cURLの情報」項目から、あなたのPHPで使用されているのlibcurlのバージョンを確認することができます。このコメントは決議に何も追加していませんが、私はそれが完全に孤立した問題ではないことを人々に伝えたいと思っていました。 – Hezad

+0

私は最終的にコマンドラインのcurl呼び出しをラップするPHPのexec()関数を使用しました。これは理想とはほど遠いですが、プロトタイプ作成にはうまくいきます。 exec( 'curl --digest -u the_login:the_password the_url'、$ params); まだ検索していますが、回答を待っています。 – Hezad

+0

私はwiresharkと同様の設定でそれをテストしました。あなたがダイジェスト認証を使用するときにカールが2つのリクエストを起こし、最初のものが認証なしであるように見えます。 問題はcurlコマンドラインがこの応答を無視し、php_curlがそれをアタッチするのはなぜですか? – gries

答えて

2

curl -I --digest -u root:somepassword http://localhost/digest-test/ 

リターン:

HTTP/1.1 401 Authorization Required 
Date: Fri, 31 May 2013 13:48:35 GMT 
Server: Apache/2.2.22 (Ubuntu) 
WWW-Authenticate: Digest realm="Test Page", nonce="9RUL3wPeBAA=52ef6531dcdd1de61f239ed6dd234a3288d81701", algorithm=MD5, domain="/digest-test/ http://localhost", qop="auth" 
Vary: Accept-Encoding 
Content-Type: text/html; charset=iso-8859-1 

HTTP/1.1 200 OK 
Date: Fri, 31 May 2013 13:48:35 GMT 
Server: Apache/2.2.22 (Ubuntu) 
Authentication-Info: rspauth="4f5f8237e9760f777255f6618c21df4c", cnonce="MTQ3NDk1", nc=00000001, qop=auth 
Vary: Accept-Encoding 
Content-Type: text/html;charset=UTF-8 
X-Pad: avoid browser bug 

のみに第二のヘッダにあなたを取得これを試すことができます(あまり最適でない解決策):

<?php 

$ch = curl_init(); 
     // set url 
curl_setopt($ch, CURLOPT_URL, "http://localhost/digest-test/"); 
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); 
curl_setopt($ch, CURLOPT_USERPWD, "root:test"); 


// first authentication with a head request 
curl_setopt($ch, CURLOPT_NOBODY, 1); 
curl_exec($ch);   

// the get the real output 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_HTTPGET, 1); 
$output = curl_exec($ch); 
echo $output; 
0

私は同じ問題を抱えていました。これは、古くからのlibcurl(私の場合は7.11.0、これは10年近く経っています)に対してPHPがコンパイルされているためです。 libcurl(7.29.0)の最新バージョンを使用している別のマシンでは、同じコードが問題なく、使用可能な最新バージョン(7.30.0)を使用するようにホストをPHPに再コンパイルした後に問題が終了しました。

この修正プログラムはa thread on the curl-library mailing list from 2008によって提案されました。このバージョンでは、バージョン7.10.6では問題が検出されましたが、7.12.1では検出されませんでした。私はlibcurl changelog around 7.12.0を検索しましたが、この問題の修正に関する明確なエントリを見つけることはできませんでしたが、「一般的なHTTP認証の改善」の対象になる可能性があります。それでも、古いlibcurlが問題であると確信しています。

あなたは、私は正確に*同じ問題を*しているphpinfo();

関連する問題