2012-04-25 21 views
10

ja staram się robić to żądanie na php, do pobrania za ostatnie źródło, z moim Bitbucket prywatnym repozytorium:Curl prośba o strawienia uwierzytelniania w PHP do pobrania Bitbucket prywatnym repozytorium

curl --digest --user user:pass https://bitbucket.org/user/repo/get/tip.zip -o test.zip 

w linii poleceń jest ok, pobieranie plików idealne, ale w php nie pracy, to mój kod 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); 

to jest odpowiedź, login jej nieważności i serwer przekierowanie do strony logowania:

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] => 
) 

Ktoś wie, w jaki sposób mogę rozwiązać mój problem? Dziękuję bardzo !!!

+0

próbowałeś tylko za pomocą uwierzytelniania podstawowego, z cURL (w ramach PHP)? – ManseUK

+1

Witam, nie pracuję z 'curl_setopt ($ ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);' i próbowałem bez opcji 'CURLOPT_HTTPAUTH', a nie –

+0

Cześć, właśnie wypróbowałem twój przykład i to działa ... Więc może zrobiłeś literówkę dla nazwa konta, hasło lub repo? – Zombaya

Odpowiedz

1

Dałem mu zwyczajowy "20 minutowy majsterkowicz" i niech mnie diabli wezmą, pracując z CURL i moim klientem HTTP OSX, nie wydaje się, żeby to się udało, i udało mi się z powodzeniem pracować z HTTP Digest i Curl w przeszłości.

Jedna z propozycji: jeśli linia poleceń działa, to dlaczego nie użyć polecenia? Czy twój serwer produkcyjny obsługuje exec()?

+0

Właśnie skończyłem z koniecznością użycia 'exec()', ponieważ miałem ten sam problem. To dość frustrujące, szczególnie jeśli nie masz dostępu do 'exec()'. Sprawdziłem wszystko i nie mogę znaleźć niezawodnego rozwiązania lub, co ważniejsze, powodu, dla którego to nie działa. – CWSpear

+0

Jeśli dowiesz się o komentarzu tutaj: -/ –

+0

Hah. Miałem ten sam problem, dopóki nie zauważyłem, że moja zmienna username zawiera spację przed zamykającą kwotą, która zadziałała dobrze podczas wywoływania przez exec() :) – demonkoryu

1

Miałem ten sam problem; usunięto wszystkie niealfanumeryczne znaki z hasła i zadziałało! Nie wiem dlaczego.

Mam nadzieję, że to pomaga.

6

Ten kod pracował dobrze dla mnie:

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'); 
+0

Nic, ale to działało dla mnie. Dzięki. –

+0

Użyłem tego skryptu do pobierania określonego pliku z obszaru pobierania. –

Powiązane problemy