2011-02-10 17 views
16

Estoy construyendo un servicio web con Zend y tengo que autenticar a los usuarios antes de enviarles una respuesta. El usuario enviará una solicitud a una página del servidor, utilizando curl, pasando sus credenciales en el formulario de curl_setopt($curl, CURLOPT_USERPWD, 'key:pass');CURL HTTP Autenticación en el lado del servidor

Iam usando Zend Framework y por lo tanto la página del lado del servidor se denota como:

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

Este es el código total para la solicitud del usuario (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);       
} 

?> 

Ahora lo Lo que quiero es que, debo ser capaz de recuperar el nombre de usuario y la contraseña en el lado del servidor (en mi controlador Zend), para que pueda verificar las credenciales de usuario de la base de datos y enviar la respuesta en consecuencia. Entonces, ¿cómo puedo hacer la autenticación en otra página?

+0

Bueno, he estado utilizando CURLOPT_HTTPHEADER para el envío de los parametros en el encabezado y iam capaz de recuperarlos en el controlador, como: $ request-> getHeader ('param'); –

Respuesta

7

Zend Framework tiene un componente listo para manejar la autenticación HTTP.

de partida de los ejemplos en

Si no desea utilizar eso, todavía se puede ir por el camino "vieja escuela", como se describe en

y comprobar manualmente en $_SERVER['PHP_AUTH_USER'] y $_SERVER['PHP_AUTH_PW']

+0

pero, para el segundo caso, como dije en el siguiente comentario, iam no obtiene esas variables en la matriz $ _SERVER. Solo aparecen si la página de destino es un archivo php, que existe en el directorio raíz. –

+1

@dskanth dependiendo de qué autenticación se haya negociado, es posible que tenga autenticación implícita. Vea el segundo ejemplo en el Manual PHP y verifique si tiene 'PHP_AUTH_DIGEST' configurado – Gordon

+0

Oh ... sí, tengo PHP_AUTH_DIGEST configurado, ¿cómo puedo modificar este ejemplo para validar las credenciales en el servidor? –

4

Debe establecer CURLOPT_HTTPAUTH en CURLAUTH_BASIC.

De esta forma, en el script de destino, PHP_AUTH_USER y PHP_AUTH_PW (texto sin formato) estarán disponibles.

guión de llamada:

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

En target.php:

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

Sugiero ejecución de la solicitud cURL a través de HTTPS, ya nombre de usuario y contraseña se transmiten de texto sin formato.

+0

Puedo obtener esos valores solo si doy el archivo de destino como .php, que se encuentra dentro del directorio raíz. Pero iam usando zend y el archivo de destino es un archivo de controlador con una acción, que toma un parámetro. He editado la pregunta con más información. –

+0

También puedo obtener esos valores en la matriz $ _SERVER, si iam no usa Zend Framework, y especifico mi URL curl como algo como: http: // localhost/pt1/public/api/v1/target.php, que no es parte de la aplicación zend, y que es solo una jerarquía de carpetas. Pero, ¿cómo lo hago con Zend Controller and Action? –

+0

Lo siento, @dskanth. No tengo idea. Me y Zend Framework no son amigos en particular. –

1

puede enviar nombre de usuario y contraseña como colocar nuestros campos

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

puede obtener las credenciales usando $ _POST

Cuestiones relacionadas