Bagaimana cara membuat permintaan menggunakan otentikasi dasar HTTP dengan curl PHP?


225

Saya sedang membangun klien layanan web REST dalam PHP dan saat ini saya menggunakan curl untuk membuat permintaan ke layanan.

Bagaimana cara saya menggunakan curl untuk membuat permintaan yang diautentikasi (dasar http)? Apakah saya harus menambahkan header sendiri?

Jawaban:


392

Kamu mau ini:

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

Zend memiliki klien REST dan zend_http_client dan saya yakin PEAR memiliki semacam bungkus. Tapi itu cukup mudah untuk dilakukan sendiri.

Jadi seluruh permintaan mungkin terlihat seperti ini:

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

Ini bekerja lebih baik daripada mengatur pengguna dan kata sandi secara terpisah
Kit Ramos

125

CURLOPT_USERPWDpada dasarnya mengirim base64 dari user:passwordstring dengan http header seperti di bawah ini:

Authorization: Basic dXNlcjpwYXNzd29yZA==

Jadi selain CURLOPT_USERPWDAnda juga dapat menggunakan HTTP-Requestopsi tajuk seperti di bawah ini dengan tajuk lainnya:

$headers = array(
    'Content-Type:application/json',
    'Authorization: Basic '. base64_encode("user:password") // <---
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

Metode ini melewati header auth kustom daripada menggunakan CURLOPT_USERPWDbekerja untuk saya.
aalaap

40

Cara paling sederhana dan asli untuk menggunakan CURL secara langsung.

Ini bekerja untuk saya:

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

Tidak seperti SOAP, REST bukan protokol standar sehingga agak sulit untuk memiliki "REST Client". Namun, karena sebagian besar layanan RESTful menggunakan HTTP sebagai protokol yang mendasarinya, Anda harus dapat menggunakan perpustakaan HTTP apa pun. Selain cURL, PHP juga menyediakannya melalui PEAR:

HTTP_Request2

yang diganti

HTTP_Request

Contoh bagaimana mereka melakukan HTTP Basic Auth

// This will set credentials for basic auth
$request = new HTTP_Request2('http://user:password@www.example.com/secret/');

Juga mendukung Digest Auth

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

Oleh REST client, saya maksudkan sesuatu yang mengabstraksi beberapa detail level rendah menggunakan curl untuk http get, post, put, delete dll. Itulah yang saya lakukan dengan membangun kelas php saya sendiri untuk melakukan ini; Saya bertanya-tanya apakah seseorang telah melakukan ini.
kosong

1
Ya, maka HTTP_Request_2 mungkin menarik bagi Anda. Itu abstrak banyak cUrl yang paling jelek di PHP. Untuk mengatur metode yang Anda gunakan, setMethod (HTTP_Request2 :: METHOD_ *). Dengan PUT dan POSTs, untuk mengatur isi permintaan Anda baru saja mengaturBody (<< perwakilan xml, json, dll. Anda di sini >>). Otentikasi dijelaskan di atas. Ini juga memiliki abstraksi untuk Respon HTTP (sesuatu yang sangat kurang cUrl).
nategood

6

Jika jenis otorisasi adalah autentik Dasar dan data yang diposting json maka lakukan seperti ini

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

Anda hanya perlu menentukan opsi CURLOPT_HTTPAUTH dan 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);

Atau sebutkan tajuk:

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

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

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


3

Michael Dowling sangat aktif dipertahankan membuang waktu adalah cara yang baik untuk pergi. Terlepas dari antarmuka yang elegan, panggilan asinkron dan kepatuhan PSR, itu membuat header otentikasi untuk panggilan REST menjadi sangat mudah:

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

Lihat dokumen .


3

Bagi yang tidak ingin menggunakan ikal:

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.