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?

kosong
sumber

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);
mr-sk
sumber
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);
Sabuj Hassan
sumber
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);
Fedir RYKHTIK
sumber
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:[email protected]/secret/');

Juga mendukung Digest Auth

// This will set credentials for Digest auth
$request->setAuth('user', 'password', HTTP_Request2::AUTH_DIGEST);
baik
sumber
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));
Sunny Vashisht
sumber
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

Serhii Andriichuk
sumber
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 .

Jannie Theunissen
sumber
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);
Wouter
sumber
-7

Ada beberapa kerangka kerja REST di luar sana. Saya akan sangat menyarankan melihat ke dalam Slim mini Framework for PHP.
Berikut adalah daftar yang lain.

kemudi
sumber