मैं PHP कर्ल के साथ HTTP मूल प्रमाणीकरण का उपयोग करके कैसे अनुरोध कर सकता हूं?


225

मैं PHP में एक REST वेब सेवा क्लाइंट का निर्माण कर रहा हूं और फिलहाल मैं सेवा के लिए अनुरोध करने के लिए कर्ल का उपयोग कर रहा हूं।

मैं प्रमाणित (HTTP मूल) अनुरोध करने के लिए कर्ल का उपयोग कैसे करूं? क्या मुझे खुद हेडर जोड़ना होगा?

जवाबों:


392

आप यह चाहते हैं:

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

Zend में एक REST क्लाइंट है और zend_http_client है और मुझे यकीन है कि PEAR में किसी प्रकार का आवरण है। लेकिन यह अपने दम पर करने के लिए काफी आसान है।

तो पूरा अनुरोध कुछ इस तरह दिख सकता है:

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

इसने तब बेहतर काम किया जब यूजर और पासवर्ड को अलग
किट रामोस

125

CURLOPT_USERPWDमूल रूप से user:passwordनीचे की ओर http हेडर के साथ स्ट्रिंग का बेस 64 भेजता है :

Authorization: Basic dXNlcjpwYXNzd29yZA==

तो इसके अलावा CURLOPT_USERPWDआप HTTP-Requestहेडर विकल्प के साथ-साथ अन्य हेडर के साथ नीचे का भी उपयोग कर सकते हैं :

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

CURLOPT_USERPWDमेरे लिए काम करने के बजाए एक कस्टम विशेषाधिकार शीर्ष लेख पास करने की यह विधि ।
आलाप

40

इसका सबसे सरल और मूल तरीका है सीधे CURL का उपयोग करना।

यह मेरे लिए काम करता है:

<?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 के विपरीत, REST एक मानकीकृत प्रोटोकॉल नहीं है, इसलिए "REST क्लाइंट" का होना थोड़ा मुश्किल है। हालाँकि, चूंकि अधिकांश प्रतिष्ठित सेवाएं HTTP को उनके अंतर्निहित प्रोटोकॉल के रूप में उपयोग करती हैं, इसलिए आपको किसी भी HTTP लाइब्रेरी का उपयोग करने में सक्षम होना चाहिए। CURL के अलावा, PHP में PEAR के माध्यम से ये हैं:

HTTP_Request2

जिसे बदल दिया गया

HTTP_Request

वे कैसे HTTP बेसिक प्रामाणिक करते हैं, इसका एक नमूना

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

डाइजेस्ट प्रामाणिक का भी समर्थन करते हैं

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

REST क्लाइंट से मेरा तात्पर्य है कि http पाने के लिए कुछ निम्न स्तर के ब्योरे को एब्सट्रैक्ट करता है http पाने के लिए, पोस्ट, पुट, डिलीट इत्यादि। अगर कोई पहले से ही ऐसा कर रहा है तो मैं सोच रहा हूं।
खाली

1
हां, तब HTTP_Request_2 आपके लिए रुचि का हो सकता है। यह PHP में cUrl के सबसे बदसूरत को दूर करता है। आपके द्वारा उपयोग की जाने वाली विधि को सेट करने के लिए, सेटमैथोड (HTTP_Request2 :: METHOD_ *)। PUT और POSTs के साथ, अनुरोध के शरीर को सेट करने के लिए आप बस सेट करें (<< अपना xml, json, आदि। यहाँ प्रतिनिधित्व >>)। ऊपर वर्णित प्रमाणीकरण। इसमें HTTP रिस्पांस (कुछ ऐसा भी है जिसकी वास्तव में कमी है) के लिए सार है।
nategood

6

यदि प्राधिकरण प्रकार मूल स्थिति है और पोस्ट किया गया डेटा json है तो इस तरह से करें

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

याहू में PHP का उपयोग करके अपनी REST सेवाओं पर कॉल करने का एक ट्यूटोरियल है:

याहू बनाओ! PHP के साथ वेब सेवा बाकी कॉल

मैंने खुद इसका उपयोग नहीं किया है, लेकिन याहू याहू है और कम से कम कुछ स्तर की गुणवत्ता के लिए गारंटी चाहिए। वे हालांकि PUT और DELETE अनुरोधों को कवर नहीं करते हैं।

इसके अलावा, उपयोगकर्ता ने योगदान दिया नोट्स कर्ल_सेक्स () और अन्य में बहुत सारी अच्छी जानकारी है।


4

आपको केवल CURLOPT_HTTPAUTH और 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);

या शीर्ष लेख निर्दिष्ट करें:

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

गुज़ले उदाहरण:

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

Https://github.com/andriichuk/php-curl-cookbook#basic-auth देखें


3

माइकल डॉवलिंग का बहुत सक्रिय रूप से बना हुआ गुज़ेल जाने का एक अच्छा तरीका है। सुरुचिपूर्ण इंटरफ़ेस, अतुल्यकालिक कॉलिंग और PSR अनुपालन के अलावा, यह REST कॉल मृत सरल के लिए प्रमाणीकरण हेडर बनाता है:

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

डॉक्स देखें ।


3

उन लोगों के लिए जो कर्ल का उपयोग नहीं करना चाहते हैं:

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.