Comment faire une demande en utilisant l'authentification de base HTTP avec PHP curl?

225

Je crée un client de service Web REST en PHP et j'utilise actuellement curl pour faire des requêtes au service.

Comment utiliser curl pour effectuer des requêtes authentifiées (http de base)? Dois-je ajouter les en-têtes moi-même?

Vide
la source

Réponses:

392

Tu veux ça:

curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);  

Zend a un client REST et zend_http_client et je suis sûr que PEAR a une sorte de wrapper. Mais c'est assez facile à faire par vous-même.

Ainsi, la demande entière pourrait ressembler à ceci:

$ch = curl_init($host);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/xml', $additionalHeaders));
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payloadName);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$return = curl_exec($ch);
curl_close($ch);
mr-sk
la source
Cela a mieux fonctionné que de définir séparément l'utilisateur et le mot de passe
Kit Ramos
125

CURLOPT_USERPWDenvoie essentiellement la base64 de la user:passwordchaîne avec l'en-tête http comme ci-dessous:

Authorization: Basic dXNlcjpwYXNzd29yZA==

Donc, à part le, CURLOPT_USERPWDvous pouvez également utiliser l' HTTP-Requestoption d'en-tête comme ci-dessous avec d'autres en-têtes:

$headers = array(
    'Content-Type:application/json',
    'Authorization: Basic '. base64_encode("user:password") // <---
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
Sabuj Hassan
la source
Cette méthode de passer un en-tête d'authentification personnalisé au lieu d'utiliser a CURLOPT_USERPWDfonctionné pour moi.
aalaap
40

La manière la plus simple et native consiste à utiliser directement CURL.

Cela fonctionne pour moi:

<?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);
Fedir RYKHTIK
la source
7

Contrairement à SOAP, REST n'est pas un protocole standardisé, il est donc un peu difficile d'avoir un "client REST". Cependant, étant donné que la plupart des services RESTful utilisent HTTP comme protocole sous-jacent, vous devriez pouvoir utiliser n'importe quelle bibliothèque HTTP. En plus de cURL, PHP a ces derniers via PEAR:

HTTP_Request2

qui a remplacé

HTTP_Request

Un exemple de la façon dont ils font l'authentification HTTP de base

// This will set credentials for basic auth
$request = new HTTP_Request2('http://user:[email protected]/secret/');

Ils prennent également en charge Digest Auth

// This will set credentials for Digest auth
$request->setAuth('user', 'password', HTTP_Request2::AUTH_DIGEST);
nategood
la source
Par client REST, je veux dire quelque chose qui résume certains des détails de bas niveau de l'utilisation de curl pour http get, post, put, delete etc. c'est ce que je fais en construisant ma propre classe php pour ce faire; Je me demande si quelqu'un a déjà fait ça.
vierge le
1
Oui, alors HTTP_Request_2 peut vous intéresser. Il résume un grand nombre des plus moches de cUrl en PHP. Pour définir la méthode que vous utilisez, setMethod (HTTP_Request2 :: METHOD_ *). Avec PUT et POST, pour définir le corps de la requête, vous venez de définir Body (<< votre représentation xml, json, etc. ici >>). Authentification décrite ci-dessus. Il a également des abstractions pour la réponse HTTP (quelque chose qui manque vraiment à cUrl).
nategood
6

Si le type d'autorisation est Authentification de base et que les données publiées sont json, faites comme ceci

<?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));
Sunny Vashisht
la source
4

Yahoo a un tutoriel sur la façon d'appeler leurs services REST en utilisant PHP:

Faites Yahoo! Appels REST de service Web avec PHP

Je ne l'ai pas utilisé moi-même, mais Yahoo est Yahoo et devrait garantir au moins un certain niveau de qualité. Cependant, ils ne semblent pas couvrir les demandes PUT et DELETE.

En outre, les notes contribuées par l' utilisateur à curl_exec () et autres contiennent de nombreuses bonnes informations.

Pekka
la source
4

Il vous suffit de spécifier les options CURLOPT_HTTPAUTH et CURLOPT_USERPWD:

$curlHandler = curl_init();

$userName = 'postman';
$password = 'password';

curl_setopt_array($curlHandler, [
    CURLOPT_URL => 'https://postman-echo.com/basic-auth',
    CURLOPT_RETURNTRANSFER => true,

    CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
    CURLOPT_USERPWD => $userName . ':' . $password,
]);

$response = curl_exec($curlHandler);
curl_close($curlHandler);

Ou spécifiez l'en-tête:

$curlSecondHandler = curl_init();

curl_setopt_array($curlSecondHandler, [
    CURLOPT_URL => 'https://postman-echo.com/basic-auth',
    CURLOPT_RETURNTRANSFER => true,

    CURLOPT_HTTPHEADER => [
        'Authorization: Basic ' . base64_encode($userName . ':' . $password)
    ],
]);

$response = curl_exec($curlSecondHandler);
curl_close($curlSecondHandler);

Exemple de buse:

use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;

$userName = 'postman';
$password = 'password';

$httpClient = new Client();

$response = $httpClient->get(
    'https://postman-echo.com/basic-auth',
    [
        RequestOptions::AUTH => [$userName, $password]
    ]
);

print_r($response->getBody()->getContents());

Voir https://github.com/andriichuk/php-curl-cookbook#basic-auth

Serhii Andriichuk
la source
3

Guzzle très activement entretenu de Michael Dowling est une bonne façon de procéder. Outre l'interface élégante, les appels asynchrones et la conformité PSR, il rend les en-têtes d'authentification pour les appels REST très 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']]);

Voir les documents .

Jannie Theunissen
la source
3

Pour ceux qui ne veulent pas utiliser curl:

//url
$url = 'some_url'; 

//Credentials
$client_id  = "";
$client_pass= ""; 

//HTTP options
$opts = array('http' =>
    array(
        'method'    => 'POST',
        'header'    => array ('Content-type: application/json', 'Authorization: Basic '.base64_encode("$client_id:$client_pass")),
        'content' => "some_content"
    )
);

//Do request
$context = stream_context_create($opts);
$json = file_get_contents($url, false, $context);

$result = json_decode($json, true);
if(json_last_error() != JSON_ERROR_NONE){
    return null;
}

print_r($result);
Wouter
la source