peticiones - ¿Cómo realizo una solicitud usando autenticación básica HTTP con PHP Curl?
peticiones http php (8)
Estoy construyendo un cliente de servicio web REST en PHP y en este momento estoy usando curl para realizar solicitudes al servicio.
¿Cómo uso curl para realizar solicitudes autenticadas (http basic)? ¿Debo agregar los encabezados yo mismo?
A diferencia de SOAP, REST no es un protocolo estandarizado, por lo que es un poco difícil tener un "Cliente REST". Sin embargo, dado que la mayoría de los servicios RESTful usan HTTP como su protocolo subyacente, debería poder usar cualquier biblioteca HTTP. Además de cURL, PHP tiene estos a través de PEAR:
que reemplazó
Una muestra de cómo lo hacen HTTP Basic Auth
// This will set credentials for basic auth
$request = new HTTP_Request2(''http://user:[email protected]/secret/'');
También es compatible con Digest Auth
// This will set credentials for Digest auth
$request->setAuth(''user'', ''password'', HTTP_Request2::AUTH_DIGEST);
El Guzzle mantenido activamente por Michael Dowling es una buena forma de hacerlo. Además de la elegante interfaz, las llamadas asíncronas y el cumplimiento de PSR, hace que los encabezados de autenticación para llamadas REST sean simples:
// Create a client with a base URL
$client = new GuzzleHttp/Client([''base_url'' => ''http://myservices.io'']);
// Send a request to http://myservices.io/status with basic authentication
$response = $client->get(''/status'', [''auth'' => [''username'', ''password'']]);
Ver los documentos .
Hay múltiples marcos REST por ahí. Recomiendo encarecidamente buscar en Slim mini Framework para PHP
Here hay una lista de otros.
La manera más simple y nativa es usar CURL directamente.
Esto funciona para mí:
<?php
$login = ''login'';
$password = ''password'';
$url = ''http://your.url'';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
$result = curl_exec($ch);
curl_close($ch);
echo($result);
Si el tipo de autorización es autenticación básica y los datos publicados son json, haga esto.
<?php
$data = array("username" => "test"); // data u want to post
$data_string = json_encode($data);
$api_key = "your_api_key";
$password = "xxxxxx";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://xxxxxxxxxxxxxxxxxxxxxxx");
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, $api_key.'':''.$password);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
''Accept: application/json'',
''Content-Type: application/json'')
);
if(curl_exec($ch) === false)
{
echo ''Curl error: '' . curl_error($ch);
}
$errors = curl_error($ch);
$result = curl_exec($ch);
$returnCode = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $returnCode;
var_dump($errors);
print_r(json_decode($result, true));
Tu quieres esto:
curl_setopt($process, CURLOPT_USERPWD, $username . ":" . $password);
Zend tiene un cliente REST y zend_http_client y estoy seguro de que PEAR tiene algún tipo de envoltorio. Pero es bastante fácil de hacer por su cuenta.
Entonces, toda la solicitud podría verse más o menos así:
$process = curl_init($host);
curl_setopt($process, CURLOPT_HTTPHEADER, array(''Content-Type: application/xml'', $additionalHeaders));
curl_setopt($process, CURLOPT_HEADER, 1);
curl_setopt($process, CURLOPT_USERPWD, $username . ":" . $password);
curl_setopt($process, CURLOPT_TIMEOUT, 30);
curl_setopt($process, CURLOPT_POST, 1);
curl_setopt($process, CURLOPT_POSTFIELDS, $payloadName);
curl_setopt($process, CURLOPT_RETURNTRANSFER, TRUE);
$return = curl_exec($process);
curl_close($process);
Yahoo tiene un tutorial sobre cómo hacer llamadas a sus servicios REST usando PHP:
Hacer Yahoo! Llamadas REST del servicio web con PHP
No lo he usado yo mismo, pero Yahoo es Yahoo y debería garantizar al menos un cierto nivel de calidad. Sin embargo, no parecen cubrir las solicitudes PUT y DELETE.
Además, las notas aportadas por el usuario a curl_exec () y otras contienen mucha información buena.
CURLOPT_USERPWD
básicamente envía la base64 del user:password
cadena de user:password
con encabezado http como se muestra a continuación:
Authorization: Basic dXNlcjpwYXNzd29yZA==
Por lo tanto, aparte de CURLOPT_USERPWD
, también puede utilizar la opción de encabezado HTTP-Request
y también a continuación con otros encabezados:
$headers = array(
''Content-Type:application/json'',
''Authorization: Basic ''. base64_encode("user:password") // <---
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);