2011-02-10 17 views
16

Buduję serwis internetowy z Zend i muszę uwierzytelnić użytkowników przed wysłaniem odpowiedzi. Użytkownik wyśle ​​żądanie do strony serwera, używając curl, przekazując swoje poświadczenia w postaci curl_setopt($curl, CURLOPT_USERPWD, 'key:pass');Uwierzytelnianie HTTP CURL po stronie serwera

IAM przy użyciu Zend Framework i tak strona po stronie serwera jest oznaczona następująco:

http://www.example.com/app_name/public/controller/action/parameter

Oto całkowity kod żądanie użytkownika (client.php):

<?php 
$curl = curl_init('http://www.example.com/app/public/user/add/1'); 

curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);       
curl_setopt($curl, CURLOPT_USERPWD, 'username:password'); 
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);      
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);       
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);       
curl_setopt($curl, CURLOPT_USERAGENT, 'Sample Code'); 

$response = curl_exec($curl);           
$resultStatus = curl_getinfo($curl);         

if($resultStatus['http_code'] == 200) { 
    echo $response; 
} else { 
    echo 'Call Failed '.print_r($resultStatus);       
} 

?> 

co teraz Chcę to, muszę być w stanie pobrać nazwę użytkownika i hasło po stronie serwera (w moim kontrolerem Zend), tak, że mogę zweryfikować poświadczenia użytkownika z bazy danych i wysłać odpowiedź odpowiednio. Więc jak mogę dokonać uwierzytelnienia na innej stronie?

+0

Well, I zostały z wykorzystaniem CURLOPT_HTTPHEADER wysyłania params w nagłówku i można je pobrać w kontrolerze, na przykład: $ request-> getHeader ('param'); –

Odpowiedz

7

Zend Framework ma gotowy komponent do obsługi uwierzytelniania HTTP.

Zamówienie przykłady w

Jeśli nie chcesz korzystać z tego, nadal można przejść „starej szkoły” sposób, jak opisano w

i ręcznie sprawdzić $_SERVER['PHP_AUTH_USER'] i $_SERVER['PHP_AUTH_PW']

+0

, ale dla drugiego przypadku, jak powiedziałem w poniższym komentarzu, nie otrzymuję tych zmiennych w tablicy $ _SERVER. Pojawiają się tylko wtedy, gdy strona docelowa jest plikiem php, który istnieje w katalogu głównym. –

+1

@dskanth w zależności od wynegocjowanego uwierzytelnienia, możesz mieć uwierzytelnianie Digest. Zobacz drugi przykład w podręczniku PHP i sprawdź, czy masz ustawione 'PHP_AUTH_DIGEST' set – Gordon

+0

Oh ... tak, mam zestaw PHP_AUTH_DIGEST, w jaki sposób mogę zmodyfikować ten przykład, aby sprawdzić poświadczenia po stronie serwera? –

4

Musisz ustawić CURLOPT_HTTPAUTH na CURLAUTH_BASIC.

W ten sposób w skrypcie docelowym będą dostępne PHP_AUTH_USER i PHP_AUTH_PW (zwykły tekst).

Wywołanie skryptu:

<?php 
$ch = curl_init('https://localhost/target.php'); 
// ... 
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
curl_exec($ch); 
?> 

W target.php:

$user = $_SERVER['PHP_AUTH_USER']; 
$pass = $_SERVER['PHP_AUTH_PASS']; 

Proponuję wykonanie żądania cURL nad HTTPS, ponieważ nazwa użytkownika i hasło są przesyłane jako zwykły tekst.

+0

Mogę uzyskać te wartości tylko wtedy, gdy nadaję plik docelowy jako .php, który znajduje się w katalogu głównym. Ale używając zend i pliku docelowego jest to plik kontrolera z akcją, która pobiera parametr. Edytowałem pytanie z większą ilością informacji. –

+0

Mogę również uzyskać te wartości w tablicy $ _SERVER, jeśli nie korzystam z Zend Framework, i podaj mój adres URL curl podobny do: http: // localhost/pt1/public/api/v1/target.php, który nie jest częścią aplikacji Zend, a który jest tylko hierarchią folderów. Ale jak to zrobić z kontrolerem i działaniem Zend? –

+0

Przykro mi, @dskanth. Nie mam pojęcia. Ja i Zend Framework nie jesteśmy szczególnymi przyjaciółmi. –

1

można wysłać login i hasło jako pola pocztowych

$post_data = $user.":".$pass 
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); 

można uzyskać poświadczenia używając $ _POST

Powiązane problemy