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

¿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.


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


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

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


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

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


1

Como en PHP 7.3:

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

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


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;

?>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.