Wie stelle ich eine Anfrage mithilfe der HTTP-Basisauthentifizierung mit PHP Curl?

225

Ich erstelle einen REST-Webdienst-Client in PHP und verwende derzeit Curl, um Anforderungen an den Dienst zu stellen.

Wie verwende ich Curl, um authentifizierte (http basic) Anfragen zu stellen? Muss ich die Header selbst hinzufügen?

leer
quelle

Antworten:

392

Du willst das:

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

Zend hat einen REST-Client und zend_http_client und ich bin sicher, PEAR hat eine Art Wrapper. Aber es ist einfach genug, es alleine zu machen.

Die gesamte Anfrage könnte also ungefähr so ​​aussehen:

$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
quelle
Dies funktionierte besser als das separate Einstellen von Benutzer und Passwort
Kit Ramos
125

CURLOPT_USERPWDsendet im Grunde die base64 der user:passwordZeichenfolge mit http-Header wie folgt:

Authorization: Basic dXNlcjpwYXNzd29yZA==

Abgesehen von CURLOPT_USERPWDkönnen Sie also auch die HTTP-RequestHeader-Option wie unten mit anderen Headern verwenden:

$headers = array(
    'Content-Type:application/json',
    'Authorization: Basic '. base64_encode("user:password") // <---
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
Sabuj Hassan
quelle
Diese Methode, einen benutzerdefinierten Auth-Header zu übergeben, anstatt ihn zu verwenden, CURLOPT_USERPWDhat bei mir funktioniert.
Aalaap
40

Am einfachsten und nativsten ist es, CURL direkt zu verwenden.

Das funktioniert bei mir:

<?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
quelle
7

Im Gegensatz zu SOAP ist REST kein standardisiertes Protokoll, daher ist es etwas schwierig, einen "REST-Client" zu haben. Da die meisten RESTful-Dienste jedoch HTTP als zugrunde liegendes Protokoll verwenden, sollten Sie in der Lage sein, jede HTTP-Bibliothek zu verwenden. Zusätzlich zu cURL hat PHP diese über PEAR:

HTTP_Request2

welches ersetzt

HTTP_Request

Ein Beispiel dafür, wie sie HTTP Basic Auth ausführen

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

Die unterstützen auch Digest Auth

// This will set credentials for Digest auth
$request->setAuth('user', 'password', HTTP_Request2::AUTH_DIGEST);
nategood
quelle
Mit REST-Client meine ich etwas, das einige der Details der Verwendung von Curl für http get, post, put, delete usw. auf niedriger Ebene abstrahiert. Dazu erstelle ich meine eigene PHP-Klasse. Ich frage mich, ob das schon jemand gemacht hat.
leer
1
Ja, dann könnte HTTP_Request_2 für Sie von Interesse sein. Es abstrahiert viele der hässlichsten von cUrl in PHP. Um die von Ihnen verwendete Methode festzulegen, setzen Sie setMethod (HTTP_Request2 :: METHOD_ *). Mit PUT und POSTs setzen Sie zum Festlegen des Hauptteils der Anforderung einfach Body (<< Ihre XML-, JSON- usw. Darstellung hier >>). Authentifizierung oben beschrieben. Es enthält auch Abstraktionen für die HTTP-Antwort (etwas, das cUrl wirklich fehlt).
Nategood
6

Wenn der Autorisierungstyp Basic auth ist und die veröffentlichten Daten json sind, gehen Sie wie folgt vor

<?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
quelle
4

Sie müssen nur die Optionen CURLOPT_HTTPAUTH und CURLOPT_USERPWD angeben:

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

Oder geben Sie den Header an:

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

Beispiel für einen Verzehr:

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

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

Serhii Andriichuk
quelle
3

Michael Dowlings sehr aktiv gepflegter Guzzle ist ein guter Weg. Abgesehen von der eleganten Benutzeroberfläche, dem asynchronen Aufruf und der PSR-Konformität sind die Authentifizierungsheader für REST-Aufrufe kinderleicht:

// 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']]);

Siehe die Dokumente .

Jannie Theunissen
quelle
3

Für diejenigen, die keine Locken verwenden möchten:

//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
quelle