Jak złożyć wniosek przy użyciu podstawowego uwierzytelniania HTTP z zawijaniem PHP?

225

Buduję klienta usług sieciowych REST w PHP, a obecnie używam curl do wysyłania żądań do usługi.

Jak używać curl do wykonywania uwierzytelnionych żądań (http basic)? Czy sam muszę dodawać nagłówki?

pusty
źródło

Odpowiedzi:

392

Chcesz to:

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

Zend ma klienta REST i zend_http_client i jestem pewien, że PEAR ma jakieś opakowanie. Ale to dość łatwe do zrobienia samemu.

Całe żądanie może wyglądać mniej więcej tak:

$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
źródło
Działa to lepiej niż osobne ustawienie użytkownika i hasła
Kit Ramos
125

CURLOPT_USERPWDw zasadzie wysyła base64 user:passwordciągu z nagłówkiem http jak poniżej:

Authorization: Basic dXNlcjpwYXNzd29yZA==

Oprócz tego CURLOPT_USERPWDmożesz także użyć HTTP-Requestopcji nagłówka, podobnie jak poniżej z innymi nagłówkami:

$headers = array(
    'Content-Type:application/json',
    'Authorization: Basic '. base64_encode("user:password") // <---
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
Sabuj Hassan
źródło
Ta metoda przekazywania niestandardowego nagłówka uwierzytelniania zamiast używania CURLOPT_USERPWDdziałała dla mnie.
aalaap
40

Najprostszym i natywnym sposobem jest bezpośrednie użycie CURL.

To działa dla mnie:

<?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
źródło
7

W przeciwieństwie do SOAP REST nie jest standardowym protokołem, więc posiadanie „klienta REST” jest nieco trudne. Ponieważ jednak większość usług RESTful używa protokołu HTTP jako podstawowego protokołu, powinna istnieć możliwość korzystania z dowolnej biblioteki HTTP. Oprócz cURL PHP ma te za pośrednictwem PEAR:

HTTP_Request2

który zastąpił

HTTP_Request

Próbka tego, jak wykonują uwierzytelnianie podstawowe HTTP

// This will set credentials for basic auth
$request = new HTTP_Request2('http://user:[email protected]/secret/');

Obsługuje również Digest Auth

// This will set credentials for Digest auth
$request->setAuth('user', 'password', HTTP_Request2::AUTH_DIGEST);
nategood
źródło
Przez klienta REST rozumiem coś, co wyodrębnia niektóre szczegóły niskiego poziomu używania curl do http get, post, put, delete itp., Co robię budując własną klasę php, aby to zrobić; Zastanawiam się, czy ktoś już to zrobił.
puste
1
Tak, więc HTTP_Request_2 może Cię zainteresować. Wyodrębnia wiele najbrzydszych cUrl w PHP. Aby ustawić używaną metodę, setMethod (HTTP_Request2 :: METHOD_ *). Z PUT i POST, aby ustawić treść żądania, po prostu ustawBody (<< reprezentacja xml, json itp. Tutaj >>). Uwierzytelnianie opisane powyżej. Ma również abstrakcje odpowiedzi HTTP (coś, czego cUrl naprawdę brakuje).
nategood
6

Jeśli typem autoryzacji jest uwierzytelnianie podstawowe, a przesyłane dane to json, zrób tak

<?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
źródło
4

Musisz tylko podać opcje CURLOPT_HTTPAUTH i 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);

Lub określ nagłówek:

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

Przykład kagana:

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

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

Serhii Andriichuk
źródło
3

Bardzo aktywnie utrzymywana Kaganiec Michaela Dowlinga jest dobrą drogą. Oprócz eleganckiego interfejsu, połączeń asynchronicznych i zgodności z PSR, nagłówki uwierzytelniania dla połączeń REST są bardzo proste:

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

Zobacz dokumenty .

Jannie Theunissen
źródło
3

Dla tych, którzy nie chcą używać 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);
Wouter
źródło