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?

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

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

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

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:password@www.example.com/secret/');

Ils prennent également en charge Digest Auth

// This will set credentials for Digest auth
$request->setAuth('user', 'password', HTTP_Request2::AUTH_DIGEST);

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


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


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 .


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.