2012-10-23 2 views
5

J'ai repéré un comportement "curieux" php CURL qui m'envoie des noix. Fondamentalement, ce que je fais est de faire un appel digest authentifié avec curl. Voici un extrait de mon code:php curl avec digest renvoie deux réponses

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

Il fonctionne très bien et le serveur est en fait en arrière avec une sorte de message « OUI, vous donnait le droit credentials ». Le seul problème, c'est que la réponse HTTP brute est un peu bizarre car elle inclut, en fait, 2 réponses au lieu d'une. Voici ce que curl_exec ($ this-> c) recrache sur:

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" 

Je ne comprends pas pourquoi il comprend la première réponse du serveur (celui dans lequel il est dit qu'il requiert une authentification).

Quelqu'un peut-il jeter quelque lumière sur le problème? Comment éviter le cumul des réponses?

Vive

+0

Je * exactement * le même problème. Ce commentaire n'ajoute rien à la résolution, mais je voulais que les gens sachent que ce n'est pas un problème totalement isolé. – Hezad

+0

J'ai finalement utilisé la fonction exec() de PHP pour encapsuler les appels de ligne de commande. C'est loin d'être idéal, mais cela fonctionne bien pour le prototypage: exec ('curl --digest -u the_login: the_password the_url', $ params); Toujours en train de chercher et d'attendre une réponse. – Hezad

+0

Je viens de le tester avec wireshark et une configuration similaire, ressemble à curl fires 2 requêtes lorsque vous utilisez l'authentification digest, et le premier est sans aucune authentification. La question est maintenant de savoir pourquoi la ligne de commande curl ignore cette réponse et php_curl l'attache. – gries

Répondre

2

Il ressemble à boucle a le même comportement si vous utilisez l'option -I pour les en-têtes:

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

retours:

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 

Pour ne recevoir que la deuxième tête vous pourrait essayer ceci (solution pas très optimale):

<?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

J'ai rencontré le même problème, et je pense qu'il a été causé par PHP compilé avec une ancienne version de libcurl (7.11.0 dans mon cas, qui a maintenant près de 10 ans). Sur une machine différente avec une version plus récente de libcurl (7.29.0) le même code était correct, et mes problèmes se sont terminés après que mon hôte ait recompilé leur PHP pour utiliser le dernier dont ils disposaient (7.30.0).

Ce correctif a été suggéré par a thread on the curl-library mailing list from 2008, où un utilisateur a découvert le problème affecté par la version 7.10.6 mais pas 7.12.1. J'ai recherché le libcurl changelog around 7.12.0 et a échoué à trouver une entrée claire sur la résolution de ce problème, bien qu'il puisse être couvert par "améliorations générales d'authentification HTTP". Pourtant, je suis maintenant assez confiant qu'une vieille libcurl est le problème.

Vous pouvez vérifier la version de libcurl est utilisé par votre PHP à partir de l'entrée « cURL information » dans la sortie de phpinfo();