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?

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

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

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

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

Die unterstützen auch Digest Auth

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

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


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


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 .


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.