PHP curl ile HTTP temel kimlik doğrulamasını kullanarak nasıl istekte bulunabilirim?


225

PHP bir REST web hizmeti istemcisi inşa ediyorum ve şu anda hizmet isteklerini yapmak için curl kullanıyorum.

Doğrulanmış (http basic) istekleri yapmak için curl'u nasıl kullanabilirim? Başlıkları kendim eklemek zorunda mıyım?

Yanıtlar:


393

Bunu istiyorsun:

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

Zend bir REST istemcisi ve zend_http_client vardır ve eminim PEAR bir tür sarıcı vardır. Ama kendi başına yapmak yeterince kolay.

Yani tüm istek şöyle görünebilir:

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

Bu, kullanıcı ve şifreyi ayrı ayrı ayarladıktan sonra daha iyi çalıştı
Kit Ramos

126

CURLOPT_USERPWDtemelde user:passwordaşağıdaki gibi http üstbilgisi ile dizenin base64 gönderir :

Authorization: Basic dXNlcjpwYXNzd29yZA==

Dolayısıyla CURLOPT_USERPWD, HTTP-Requestbaşlık seçeneğini aşağıdaki gibi diğer başlıklarla da kullanabilirsiniz :

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

Bu yöntemi kullanmak yerine özel bir yetkilendirme üstbilgisi geçirme CURLOPT_USERPWDbenim için çalıştı.
aalaap

40

CURL'u doğrudan kullanmanın en basit ve yerel yolu.

Bu benim için çalışıyor:

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

SOAP'ın aksine, REST standartlaştırılmış bir protokol değildir, bu nedenle "REST İstemcisi" sahibi olmak biraz zordur. Ancak, çoğu RESTful hizmeti temel protokol olarak HTTP kullandığından, herhangi bir HTTP kitaplığını kullanabilmeniz gerekir. CURL'a ek olarak, PHP PEAR aracılığıyla bunlara sahiptir:

HTTP_Request2

hangisinin yerini aldı

http_request

HTTP Temel Yetkilendirme yönteminin nasıl yapıldığına dair bir örnek

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

Ayrıca Digest Auth desteği

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

REST istemcisi ile http get, post, put, delete vb. Birinin bunu zaten yapıp yapmadığını merak ediyorum.
boş

1
Evet, HTTP_Request_2 ilginizi çekebilir. PHP'deki en çirkin cUrl dosyasını soyutlar. Kullandığınız yöntemi ayarlamak için setMethod'u (HTTP_Request2 :: METHOD_ *) ayarlayın. PUT ve POST'larla, istek gövdesini ayarlamak için sadeceBody ayarladınız (<< xml, json, vb. Burada temsil >>). Yukarıda açıklanan kimlik doğrulama. Ayrıca HTTP Yanıtı için soyutlamalar vardır (cUrl'nin gerçekten eksik olduğu bir şey).
nategood

6

Yetkilendirme türü Temel kimlik doğrulamasıysa ve yayınlanan veriler json ise bunu yapın

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

Sadece CURLOPT_HTTPAUTH ve CURLOPT_USERPWD seçeneklerini belirtmeniz gerekir:

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

Veya başlığı belirtin:

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

Guzzle örneği:

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

Bkz. Https://github.com/andriichuk/php-curl-cookbook#basic-auth


3

Michael Dowling'in çok aktif bir şekilde bakımı yapılan Guzzle gitmek için iyi bir yoldur. Zarif arayüzü, eşzamansız arama ve PSR uyumluluğu dışında, REST çağrıları için kimlik doğrulama başlıklarını basitleştirir:

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

Belgelere bakın .


3

Curl kullanmak istemeyenler için:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.