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

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.


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


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

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


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

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


1

Jak w PHP 7.3:

curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BEARER);
curl_setopt($ch,CURLOPT_XOAUTH2_BEARER,$bearerToken);

0

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

$authorization = "Authorization: Bearer 080042cad6356ad5dc0a720c18b53b8e53d4c274"

z:

$authorization = "PRIVATE-TOKEN 080042cad6356ad5dc0a720c18b53b8e53d4c274";


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;

?>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.