Làm cách nào để tôi thực hiện một yêu cầu sử dụng xác thực cơ bản HTTP với PHP curl?


225

Tôi đang xây dựng một ứng dụng khách dịch vụ web REST bằng PHP và hiện tại tôi đang sử dụng curl để thực hiện các yêu cầu đối với dịch vụ.

Làm cách nào để sử dụng curl để thực hiện các yêu cầu xác thực (http cơ bản)? Tôi có phải thêm tiêu đề cho mình không?

Câu trả lời:


392

Bạn muốn điều này:

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

Zend có ứng dụng khách REST và zend_http_client và tôi chắc chắn PEAR có một số loại trình bao bọc. Nhưng nó đủ dễ để tự làm.

Vì vậy, toàn bộ yêu cầu có thể trông giống như thế này:

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

Điều này hoạt động tốt hơn sau đó đặt riêng người dùng và mật khẩu
Kit Ramos

125

CURLOPT_USERPWDvề cơ bản gửi cơ sở64 của user:passwordchuỗi với tiêu đề http như dưới đây:

Authorization: Basic dXNlcjpwYXNzd29yZA==

Vì vậy, ngoài việc CURLOPT_USERPWDbạn cũng có thể sử dụng HTTP-Requesttùy chọn tiêu đề cũng như bên dưới với các tiêu đề khác:

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

Phương pháp chuyển tiêu đề xác thực tùy chỉnh này thay vì sử dụng CURLOPT_USERPWDlàm việc cho tôi.
aalaap

40

Cách đơn giản và tự nhiên nhất là sử dụng trực tiếp CURL.

Điều này làm việc cho tôi:

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

Không giống như SOAP, REST không phải là một giao thức được tiêu chuẩn hóa nên hơi khó để có một "Máy khách REST". Tuy nhiên, vì hầu hết các dịch vụ RESTful sử dụng HTTP làm giao thức cơ bản của chúng, bạn sẽ có thể sử dụng bất kỳ thư viện HTTP nào. Ngoài cURL, PHP có những thứ này thông qua PEAR:

HTTP_Request2

mà thay thế

HTTP_Request

Một ví dụ về cách họ thực hiện HTTP Basic Auth

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

Cũng hỗ trợ Digest Auth

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

Theo ứng dụng khách REST tôi có nghĩa là một cái gì đó trừu tượng hóa một số chi tiết cấp thấp của việc sử dụng curl cho http get, post, put, xóa, v.v. đó là những gì tôi đang làm bằng cách xây dựng lớp php của riêng tôi để làm điều này; Tôi tự hỏi nếu ai đó đã làm điều này.
trống

1
Có, sau đó HTTP_Request_2 có thể bạn quan tâm. Nó trừu tượng hóa rất nhiều thứ xấu nhất của cUrl trong PHP. Để đặt phương thức bạn sử dụng, setMethod (HTTP_Request2 :: METHOD_ *). Với PUT và POST, để đặt phần thân của yêu cầu bạn vừa đặtBody (<< đại diện xml, json, v.v. của bạn ở đây >>). Xác thực được mô tả ở trên. Nó cũng có bản tóm tắt cho Phản hồi HTTP (thứ mà cUrl thực sự thiếu).
chiến lược

6

Nếu loại ủy quyền là Cơ sở xác thực và dữ liệu được đăng là json thì hãy làm như thế này

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

Yahoo có một hướng dẫn về cách thực hiện các cuộc gọi đến các dịch vụ REST của họ bằng PHP:

Làm cho Yahoo! Dịch vụ web REST Gọi với PHP

Tôi đã không sử dụng nó cho mình, nhưng Yahoo là Yahoo và phải đảm bảo ít nhất một số mức chất lượng. Mặc dù vậy, chúng dường như không bao gồm các yêu cầu PUT và DELETE.

Ngoài ra, Ghi chú đóng góp của người dùng cho curl_exec () và những người khác chứa nhiều thông tin tốt.


4

Bạn chỉ cần xác định các tùy chọn CURLOPT_HTTPAUTH và 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);

Hoặc chỉ định tiêu đề:

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

Ví dụ hướng dẫn:

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

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


3

Gu Gu duy trì rất tích cực của Michael Dowling là một cách tốt để đi. Ngoài giao diện thanh lịch, gọi không đồng bộ và tuân thủ PSR, nó làm cho các tiêu đề xác thực cho các cuộc gọi REST trở nên đơn giản:

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

Xem tài liệu .


3

Đối với những người không muốn sử dụng curl:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.