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.