Demande Curl avec digest authentification en PHP pour télécharger Bitbucket repository privé
j'essaie de faire cette demande sur php, pour télécharger la dernière source de mon dépôt privé Bitbucket:
curl --digest --user user:pass https://bitbucket.org/user/repo/get/tip.zip -o test.zip
en ligne de commande son ok, le téléchargement de fichier parfait, mais en php ne fonctionne pas, ce mon code php:
$out = fopen('test.zip', 'w+');
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
curl_setopt($ch, CURLOPT_USERPWD, 'user:pass');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FILE, $out);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_NOBODY, false);
curl_setopt($ch, CURLOPT_URL, 'https://bitbucket.org/user/repo/get/tip.zip');
curl_exec($ch);
C'est la réponse, le login son invalide et le serveur redirigent vers la page de login:
Error CURL: ''
Error number: 0
Array
(
[url] => https://bitbucket.org/account/signin/?next=/user/repo/get/tip.tar.gz
[content_type] => text/html; charset=utf-8
[http_code] => 200
[header_size] => 1099
[request_size] => 194
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 1
[total_time] => 1.055465
[namelookup_time] => 1.5E-5
[connect_time] => 0.102969
[pretransfer_time] => 0.216164
[size_upload] => 0
[size_download] => 10049
[speed_download] => 9520
[speed_upload] => 0
[download_content_length] => 10049
[upload_content_length] => 0
[starttransfer_time] => 0.527512
[redirect_time] => 0.527519
[redirect_url] =>
)
quelqu'un sait comment je peux résoudre mon problème? Merci beaucoup!!!
3 réponses
ce code a bien fonctionné pour moi:
define('USERNAME','username');
define('PASSWORD','password');
function download($url, $destination) {
try {
$fp = fopen($destination, "w");
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, USERNAME . ":" . PASSWORD);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$resp = curl_exec($ch);
// validate CURL status
if(curl_errno($ch))
throw new Exception(curl_error($ch), 500);
// validate HTTP status code (user/password credential issues)
$status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($status_code != 200)
throw new Exception("Response with Status Code [" . $status_code . "].", 500);
}
catch(Exception $ex) {
if ($ch != null) curl_close($ch);
if ($fp != null) fclose($fp);
throw new Exception('Unable to properly download file from url=[' + $url + '] to path [' + $destination + '].', 500, $ex);
}
if ($ch != null) curl_close($ch);
if ($fp != null) fclose($fp);
}
download('https://bitbucket.org/brunobraga/playground/get/tip.tar.gz', '/tmp/test.tar.gz');
je lui ai donné la coutume" 20 minutes tinker " et je serai damné, travailler avec CURL et mon client HTTP OSX cela ne semble pas vouloir bouger, et j'ai travaillé avec succès avec HTTP Digest et Curl dans le passé.
Une suggestion: si la ligne de commande fonctionne alors pourquoi ne pas utiliser la commande? Votre serveur de production supporte-t-il exec()
?
j'ai eu le même problème; j'ai supprimé tous les caractères non alphanumériques du mot de passe et ça a marché! Je ne sais pas pourquoi.
j'espère que ça aidera.