respuesta peticiones peticion example ejemplos php rest curl basic-authentication

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:

HTTP_Request2

que reemplazó

HTTP_Request

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 .



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);



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);