Prawidłowy sposób ustawienia tokena okaziciela za pomocą CURL

87

Otrzymuję token okaziciela z punktu końcowego interfejsu API i ustawiam następujące ustawienia:

$authorization = "Bearer 080042cad6356ad5dc0a720c18b53b8e53d4c274"

Następnie chcę użyć CURL, aby uzyskać dostęp do bezpiecznego punktu końcowego, jednak nie jestem pewien, jak i gdzie ustawić token okaziciela.

Próbowałem tego, ale to nie działa:

 curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json' , $authorization ));
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS,$post);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    $result = curl_exec($ch);
    curl_close($ch);
    return json_decode($result);

EDYTOWAĆ:

Zgodnie z dokumentacją mam używać tokena okaziciela jako takiego: https://apigility.org/documentation/auth/authentication-oauth2

GET /oauth/resource HTTP/1.1
Accept: application/json
Authorization: Bearer 907c762e069589c2cd2a229cdae7b8778caa9f07
HappyCoder
źródło
Czy to jest PHP? W jaki sposób serwer oczekuje wysłania tego tokena? Nagłówek?
Cześć - tak to jest PHP, generalnie token okaziciela jest ustawiony jako nagłówek.
HappyCoder
Jaka jest nazwa nagłówka?
Dodałem edycję z dokumentacji.
HappyCoder

Odpowiedzi:

120

Zastąpić:

$authorization = "Bearer 080042cad6356ad5dc0a720c18b53b8e53d4c274"

z:

$authorization = "Authorization: Bearer 080042cad6356ad5dc0a720c18b53b8e53d4c274";

aby był prawidłowym i działającym nagłówkiem autoryzacji.

Hans Z.
źródło
Cześć - to jest coś, czego próbowałem, ale z tym samym problemem. Podejrzewam, że problem może być związany z aktualizacją Apigility, ponieważ nie mogę sprawić, by działało to również na listonoszach.
HappyCoder
Rozwiązano ten problem, przywracając ApiGility do poprzedniej stabilnej wersji. Dziękuję za wkład, chociaż nie moje rozwiązanie, jest to rozwiązanie dla innych z podobnym problemem i doprowadziło mnie do właściwej ścieżki. Dziękuję za wkład!
HappyCoder
Czy możesz w tym pomóc? stackoverflow.com/questions/58581568/…
user4271704
38

Jest to funkcja cURL, która może wysyłać lub pobierać dane. Powinien działać z każdą aplikacją PHP obsługującą OAuth:

    function jwt_request($token, $post) {

       header('Content-Type: application/json'); // Specify the type of data
       $ch = curl_init('https://APPURL.com/api/json.php'); // Initialise cURL
       $post = json_encode($post); // Encode the data array into a JSON string
       $authorization = "Authorization: Bearer ".$token; // Prepare the authorisation token
       curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json' , $authorization )); // Inject the token into the header
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
       curl_setopt($ch, CURLOPT_POST, 1); // Specify the request method as POST
       curl_setopt($ch, CURLOPT_POSTFIELDS, $post); // Set the posted fields
       curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // This will follow any redirects
       $result = curl_exec($ch); // Execute the cURL statement
       curl_close($ch); // Close the cURL connection
       return json_decode($result); // Return the received data

    }

Użyj go w ramach żądań jednokierunkowych lub dwukierunkowych:

$token = "080042cad6356ad5dc0a720c18b53b8e53d4c274"; // Get your token from a cookie or database
$post = array('some_trigger'=>'...','some_values'=>'...'); // Array of data with a trigger
$request = jwt_request($token,$post); // Send or retrieve data
SergeDirect
źródło
Ktoś dodał głos negatywny. Czy mógłbyś to rozwinąć w komentarzach poniżej?
SergeDirect
2
Dzięki Serge ... Zbyt długo walczyłem z takim telefonem. WSZYSTKIE dokumenty mówią „zbuduj tablicę POST za pomocą http_build_query ()”. ALE to nie działa - nie wiem, czy jest to osobliwość OAuth, ale to, czego potrzebujesz, to json_encode, jak pokazano tutaj. Wysłano wirtualne piwo.
anoldermark
2
@anoldermark Cieszę się, że mogłem być pomocny. Wielkie dzięki za kciuk do góry, to prawdziwa różnica. Pisanie wartościowych odpowiedzi wymaga czasu i wysiłku, głosy za i pozytywne komentarze są zachęcające ... pisać więcej, pisać dobrze;)
SergeDirect
@ SergeDirect, Jak uzyskamy wartości postów w pliku APPURL.com/api/json.php i jak działa autoryzacja jwt. Podaj przykład.
akgola
1
Czy możesz w tym pomóc? stackoverflow.com/questions/58581568/…
user4271704
11

To powinno działać

$token = "YOUR_BEARER_AUTH_TOKEN";
//setup the request, you can also use CURLOPT_URL
$ch = curl_init('API_URL');

// Returns the data/output as a string instead of raw data
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

//Set your auth headers
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
   'Content-Type: application/json',
   'Authorization: Bearer ' . $token
   ));

// get stringified data/output. See CURLOPT_RETURNTRANSFER
$data = curl_exec($ch);

// get info about the request
$info = curl_getinfo($ch);
// close curl resource to free up system resources
curl_close($ch);
Sudirman Hung
źródło
4

Przykład Guzzle:

use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;

$token = 'your_token';

$httpClient = new Client();

$response = $httpClient->get(
    'https://httpbin.org/bearer',
    [
        RequestOptions::HEADERS => [
            'Accept' => 'application/json',
            'Authorization' => 'Bearer ' . $token,
        ]
    ]
);

print_r($response->getBody()->getContents());

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

Serhii Andriichuk
źródło
1

Jak w PHP 7.3:

curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BEARER);
curl_setopt($ch,CURLOPT_XOAUTH2_BEARER,$bearerToken);
Pancho
źródło
0

Jeśli zamiast tego pracujesz z prywatnym tokenem ( takim jak Gitlab API ), powinieneś wymienić:

$authorization = "Authorization: Bearer 080042cad6356ad5dc0a720c18b53b8e53d4c274"

z:

$authorization = "PRIVATE-TOKEN 080042cad6356ad5dc0a720c18b53b8e53d4c274";

GuGuss
źródło
0
<?php
$curl = curl_init();

curl_setopt_array($curl, array(
CURLOPT_URL => "your api goes here",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => array(
"Authorization: Bearer eyJ0eciOiJSUzI1NiJ9.eyJMiIsInNjb3BlcyI6W119.K3lW1STQhMdxfAxn00E4WWFA3uN3iIA"
  ),
 ));

$response = curl_exec($curl);
$data = json_decode($response, true);

echo $data;

?>
Raj Shekhar
źródło