He visto el post para el uso de la clave de la api de autenticación post de llamadas en el rizo. Tengo un GET llamada que requiere apikey para la autorización yo.e la solicitud debe tener un encabezado de autorización cantaining el apiKey. He obtenido la clave de la api y tratar de usarlo para una llamada llega :

<?php

$service_url = 'http://localhost/finals/task_manager/v1/tasks/Authorization:'.$apiKey;
$curl = curl_init($service_url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$curl_response = curl_exec($curl);
if ($curl_response === false) {
    $info = curl_getinfo($curl);
    curl_close($curl);
    die('error occured during curl exec. Additioanl info: ' . var_export($info));
}

curl_close($curl);
$decoded1 = json_decode($curl_response,true);
if (isset($decoded1->response->status) && $decoded1->response->status == 'ERROR') {
    die('error occured: ' . $decoded1->response->errormessage);
}
echo 'response ok!';
var_export($decoded1->response);
?>

Estoy recibiendo el error en la respuesta json:

{"error":true,"message":"Api key is misssing"}

He intentado un par de otras maneras, como pasar un encabezado de la matriz, pero sigo recibiendo el error.
La forma correcta de obtener el curl_response ? ¿Cómo debo pasar el encabezado de Autorización que utiliza la clave de la api ?

La api para la llamada llega estoy haciendo es (creado usando Slim de la Biblioteca) :

index.php
/**
 * Listing all tasks of particual user
 * method GET
 * url /tasks          
 */
$app->get('/tasks', 'authenticate', function() {
            global $user_id;
            $response = array();
            $db = new DbHandler();

            //fetching all user tasks
            $result = $db->getAllUserTasks($user_id);

            $response["error"] = false;
            $response["tasks"] = array();

            //looping through result and preparing tasks array
            while ($task = $result->fetch_assoc()) {
                $tmp = array();
                $tmp["id"] = $task["id"];
                $tmp["task"] = $task["task"];
                $tmp["status"] = $task["status"];
                $tmp["createdAt"] = $task["created_at"];
                array_push($response["tasks"], $tmp);
            }

            echoRespnse(200, $response);
        });

La autenticar función es :

in the same index.php file
/**
 * Adding Middle Layer to authenticate every request
 * Checking if the request has valid api key in the 'Authorization' header
 */
function authenticate(\Slim\Route $route) {
    //Getting request headers
    $headers = apache_request_headers();
    $response = array();
    $app = \Slim\Slim::getInstance();

    //Verifying Authorization Header
    if (isset($headers['Authorization'])) {
        $db = new DbHandler();

        //get the api key
        $api_key = $headers['Authorization'];
        //validating api key
        if (!$db->isValidApiKey($api_key)) {
            //api key is not present in users table
            $response["error"] = true;
            $response["message"] = "Access Denied. Invalid Api key";
            echoRespnse(401, $response);
            $app->stop();
        } else {
            global $user_id;
            //get user primary key id
            $user = $db->getUserId($api_key);
            if ($user != NULL)
                $user_id = $user["id"];
        }
    } else {
        //api key is missing in header
        $response["error"] = true;
        $response["message"] = "Api key is misssing";
        echoRespnse(400, $response);
        $app->stop();
    }
}
  • Sin saber exactamente de la API o de sus llamadas, va a ser difícil saber realmente… Algunas Api requieren métodos específicos para ser enviado así, además de los encabezados.
  • Pongo a la api.por favor, eche un vistazo.
InformationsquelleAutor Florentino | 2014-10-21

3 Comentarios

  1. 13

    ok, así que debe ser bastante sencillo… Podría intentar y agregar:

    curl_setopt($curl, CURLOPT_HTTPHEADER, array(
    'Authorization: ' . $apiKey
    ));

    a su curl? Después de eso, hacer un print_r($encabezados) en su autenticarse() función para ver si lo recibe aceptar.

    • Gracias funciona, yo había intentado algo similar, pero fue incluido demasiadas cosas. Gracias de nuevo.
  2. 1

    Acceso a servicio web el uso personalizado de la clave de Autorización.

    Cliente PHP,client.php

    $name = 'Book name';
    //Server url
    $url = "http://localhost/php-rest/book/$name";
    $apiKey = '32Xhsdf7asd5'; //should match with Server key
    $headers = array(
         'Authorization: '.$apiKey
    );
    //Send request to Server
    $ch = curl_init($url);
    //To save response in a variable from server, set headers;
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    //Get response
    $response = curl_exec($ch);
    //Decode
    $result = json_decode($response);

    PHP del Servidor, index.php

    header("Content-Type:application/json");
    $seceretKey = '32Xhsdf7asd';
    $headers = apache_request_headers();
        if(isset($headers['Authorization'])){
            $api_key = $headers['Authorization'];
            if($api_key != $seceretKey) 
            {
                //403,'Authorization faild'; your logic
                exit;
            }
        }
  3. 0

    para superar este problema al pasar una clave de Api de Antemano resto de cliente de Autorización de uso en lugar de la autorización en el parámetro de cabecera. a continuación, se va a trabajar.

Dejar respuesta

Please enter your comment!
Please enter your name here