2011-02-10 23 views
16

Sto creando un servizio Web con Zend e devo autenticare gli utenti prima di inviare loro la risposta. L'utente invierà una richiesta a una pagina del server, utilizzando curl, passando le sue credenziali sotto forma di curl_setopt($curl, CURLOPT_USERPWD, 'key:pass');Autenticazione HTTP CURL sul lato server

Iam utilizzando Zend Framework e quindi nella pagina lato server è indicato come:

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

Ecco il codice totale per la richiesta dell'utente (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);       
} 

?> 

Ora che cosa Voglio che, devo essere in grado di recuperare il nome utente e la password sul lato server (nel mio controller zend), in modo che io possa verificare le credenziali dell'utente dal database e inviare la risposta di conseguenza. Quindi, come posso fare l'autenticazione in un'altra pagina?

+0

Beh, ho utilizzato CURLOPT_HTTPHEADER per l'invio delle params in header e iam in grado di recuperarli nel controller, come: $ request-> getHeader ('param'); –

risposta

7

Zend Framework dispone di un componente pronto per la gestione dell'autenticazione HTTP.

Acquista gli esempi a

Se non si desidera utilizzare questo, si può ancora andare via "vecchia scuola", come descritto nella

e controllare manualmente il $_SERVER['PHP_AUTH_USER'] e $_SERVER['PHP_AUTH_PW']

+0

ma, per il secondo caso, come ho detto nel commento qui sotto, non riesco a ottenere quelle variabili nell'array $ _SERVER. Appaiono solo se la pagina di destinazione è un file php, che esiste nella directory principale. –

+1

@dskanth a seconda dell'autenticazione negoziata, potresti avere l'autenticazione del digest. Vedi il secondo esempio nel manuale PHP e verifica se hai impostato 'PHP_AUTH_DIGEST' – Gordon

+0

Oh ... sì, ho impostato PHP_AUTH_DIGEST, come posso modificare questo esempio per convalidare le credenziali sul lato server? –

4

È necessario impostare CURLOPT_HTTPAUTH su CURLAUTH_BASIC.

In questo modo, nello script di destinazione, PHP_AUTH_USER e PHP_AUTH_PW (testo normale) saranno disponibili.

script chiamante:

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

In target.php:

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

Suggerisco di dare esecuzione alla richiesta cURL su HTTPS dal nome utente e la password vengono trasmessi testo normale.

+0

Iam è in grado di ottenere quei valori solo se fornisco il file di destinazione come .php, che si trova all'interno della directory root. Ma iam usando zend e il file di destinazione è un file controller con un'azione, che accetta un parametro. Ho modificato la domanda con ulteriori informazioni. –

+0

Iam può anche ottenere quei valori nell'array $ _SERVER, se iam non usa zend framework e specifica il mio URL di arricciatura come: http: // localhost/pt1/public/api/v1/target.php, che non fa parte dell'applicazione zend e che è solo una gerarchia di cartelle. Ma come faccio a farlo con zend controller e action? –

+0

Mi dispiace, @dskanth. Non ne ho idea. Io e Zend Framework non sono amici particolari. –

1

è possibile inviare il nome utente e la password come campi pubblicare

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

è possibile ottenere le credenziali utilizzando $ _POST

Problemi correlati