web-dev-qa-db-fra.com

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

Je construis un client de service Web REST dans PHP et, pour le moment, j'utilise curl pour envoyer 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?

209
blank

Tu veux ça:

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

Zend a un client REST et un 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 à quelque chose comme 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);
354
mr-sk

CURLOPT_USERPWD envoie essentiellement le base64 de la chaîne user:password avec l'entête http comme ci-dessous:

Authorization: Basic dXNlcjpwYXNzd29yZA==

Ainsi, en dehors du CURLOPT_USERPWD, vous pouvez également utiliser l'option d'en-tête HTTP-Request 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);
108
Sabuj Hassan

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);
37
Fedir RYKHTIK

Contrairement à SOAP, REST n'est pas un protocole normalisé, il est donc un peu difficile d'avoir un "client REST". Toutefois, é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 ceux-ci via PEAR:

HTTP_Request2

qui a remplacé

HTTP_Request

Un exemple de comment ils font HTTP Basic Auth

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

Le supporte également Digest Auth

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

Si le type d'autorisation est Basic auth et que les données enregistrées sont au format json, procédez comme suit.

<?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));
5
Sunny Vashisht

Yahoo propose un tutoriel sur les appels à leurs services REST à l'aide de PHP:

Rendre le service Web Yahoo! REST Appels 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é. Ils ne semblent pas couvrir les demandes PUT et DELETE, cependant.

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

4
Pekka 웃

Michael Dowling est très activement maintenu Guzzle est un bon chemin à parcourir. Outre l'interface élégante, l'appel asynchrone et la conformité PSR, les en-têtes d'authentification pour REST appellent les morts simplement:

// 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 la documentation .

3
Jannie Theunissen

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

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 Guzzle:

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

0
Serge Andriichuk