Forma correcta de configurar el token de portador con CURL

81

Obtengo mi token de portador de un punto final de API y configuro lo siguiente:

$authorization = "Bearer 080042cad6356ad5dc0a720c18b53b8e53d4c274"

A continuación, quiero usar CURL para acceder al punto final seguro, sin embargo, no estoy seguro de cómo o dónde configurar el token de portador.

He intentado esto pero no funciona:

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

EDITAR:

De acuerdo con la documentación, se supone que debo usar el token de portador como tal: https://apigility.org/documentation/auth/authentication-oauth2

GET /oauth/resource HTTP/1.1
Accept: application/json
Authorization: Bearer 907c762e069589c2cd2a229cdae7b8778caa9f07
HappyCoder
fuente
¿Es esto PHP? ¿Cómo espera el servidor que se envíe este token? ¿Un encabezado?
Hola, sí, esto es PHP, generalmente el token de portador se establece como encabezado.
HappyCoder
¿Cuál es el nombre del encabezado?
He agregado una edición de la documentación.
HappyCoder

Respuestas:

115

Reemplazar:

$authorization = "Bearer 080042cad6356ad5dc0a720c18b53b8e53d4c274"

con:

$authorization = "Authorization: Bearer 080042cad6356ad5dc0a720c18b53b8e53d4c274";

para convertirlo en un encabezado de autorización válido y funcional.

Hans Z.
fuente
Hola, esto es algo que probé, pero con el mismo problema. Sospecho que el problema puede tener algo que ver con una actualización de Apigility, ya que tampoco puedo hacer que esto funcione en el cartero.
HappyCoder
Resolvió este problema haciendo retroceder ApiGility a una versión estable anterior. Gracias por su aporte, aunque no es mi solución, es una solución para otros con un problema similar y me llevó por el buen camino. ¡Gracias por su aporte!
HappyCoder
¿Puedes ayudar con esto? stackoverflow.com/questions/58581568/…
user4271704
36

Esta es una función cURL que puede enviar o recuperar datos. Debería funcionar con cualquier aplicación PHP que admita 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

    }

Úselo en solicitudes unidireccionales o bidireccionales:

$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
fuente
Alguien agregó un voto negativo, ¿podría dar más detalles en los comentarios a continuación?
SergeDirect
2
Gracias Serge ... Estuve luchando demasiado con una llamada como esta. TODOS los documentos dicen "construye la matriz POST con http_build_query ()". PERO eso no funciona, no sé si es una peculiaridad de OAuth, pero lo que necesita es json_encode como se muestra aquí. Cerveza virtual enviada.
anoldermark
2
@anoldermark Me alegro de ser útil. Muchas gracias por el pulgar hacia arriba, hace una gran diferencia. Se necesita tiempo y esfuerzo para escribir respuestas de calidad, los votos a favor y los comentarios positivos son alentadores ... escribir más, escribir bien;)
SergeDirect
@ SergeDirect, Cómo obtendremos los valores de publicación en el archivo APPURL.com/api/json.php y cómo funciona la autenticación jwt. Por favor, dé un ejemplo.
Akgola
1
¿Puedes ayudar con esto? stackoverflow.com/questions/58581568/…
user4271704
11

Esto debería funcionar

$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
fuente
3

Ejemplo de trago:

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

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

Serhii Andriichuk
fuente
1

Como en PHP 7.3:

curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BEARER);
curl_setopt($ch,CURLOPT_XOAUTH2_BEARER,$bearerToken);
Pancho
fuente
0

Si está trabajando con un token privado en su lugar ( como la API de Gitlab ), debe reemplazar:

$authorization = "Authorization: Bearer 080042cad6356ad5dc0a720c18b53b8e53d4c274"

con:

$authorization = "PRIVATE-TOKEN 080042cad6356ad5dc0a720c18b53b8e53d4c274";

GuGuss
fuente
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
fuente