Pregunta: ¿Cómo solucionar la respuesta de autenticación servidor auth_server.php ? Tengo problema con esta clase y realmente llevo dos ...

Angel de Jesus Quintero Pereira

Angel de Jesus Quintero Pereira

Pregunta
studenthace 4 años

Pregunta:

¿Cómo solucionar la respuesta de autenticación servidor auth_server.php ?

Tengo problema con esta clase y realmente llevo dos días trancado.

Problema:

Al realizar la petición php el servidor de validación muestra lo siguiente:

Invalid request (Unsupported SSL request)

![](Captura de pantalla de 2021-06-02 12-42-30.png

contexto del problema

En esta clase se intenta demostrar como es el uso de la autenticación de token con php. Para ellos el flujo del funcionamiento del código es el siguiente:

  • Se tiene un servidor de recursos llamado “server.php” este servidor se encarga de los recursos que se tiene.
  • Se tiene un servidor de rutas llamado “router.php” este servidor es el encargado de recibir las peticiones dársela al servidor de recursos llamado “server.php”
  • Se tiene un servidor para la autenticación llamado auth_server.php, este servidor tiene dos funciones.
    1. Crear un token cuando el usuario vaya a iniciar sesión
    2. Validar El token que el usuario le suministra al servidor de recursos llamado server.php

código del server.php

<?php header('Content-Type: application/json'); // validación de que el servidor de recursos recibió un token if (!array_key_exists('HTTP_X_TOKEN', $_SERVER)) { die; } // $url = 'https://' . $_SERVER['HTTP_HOST'] . '/auth'; // Se debe validar el token recibido con el servidor, // de autenticación ejecutando una llamada a tráves // de curl. $url = 'https://localhost:8001'; // iniciamos la llamada de curl $ch = curl_init($url); // Se configura curl para enviar // el token y validarlo con el serrvidor // de validación. curl_setopt( $ch, CURLOPT_HTTPHEADER, [ "X-Token: {$_SERVER['HTTP_X_TOKEN']}", ] ); // Se configura curl nuevamente para recibir la // respuesta sobre el token que enviamos // del servidor de validación curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); // Se obtine la respuesta del servidor // de validación $ret = curl_exec($ch); // finalmente se compara la respuesta del servidor // de autenticación, si el resultado no es true // entonces el usuario no ha sido autenticado // correctamente if ($ret !== 'true') { http_response_code(403); die; } $books = [ 1 => [ 'titulo' => 'Lo que el viento se llevo', 'id_autor' => 2, 'id_genero' => 2, ], 2 => [ 'titulo' => 'La Iliada', 'id_autor' => 1, 'id_genero' => 1, ], 3 => [ 'titulo' => 'La Odisea', 'id_autor' => 1, 'id_genero' => 1, ], ]; $allowedResourceTypes = [ 'books', 'authors', 'genres', ]; $resourceType = $_GET['resource_type']; if (!in_array($resourceType, $allowedResourceTypes)) { header('Status-Code: 400'); echo json_encode( [ 'error' => "Resource type '$resourceType' is un unkown", ] ); die; } $resourceId = array_key_exists('resource_id', $_GET) ? $_GET['resource_id'] : ''; $method = $_SERVER['REQUEST_METHOD']; switch (strtoupper($method)) { case 'GET': if ("books" !== $resourceType) { header('Status-Code: 404'); echo json_encode( [ 'error' => $resourceType . ' not yet implemented :(', ] ); die; } if (!empty($resourceId)) { if (array_key_exists($resourceId, $books)) { echo json_encode( $books[$resourceId] ); } else { header('Status-Code: 404'); echo json_encode( [ 'error' => 'Book ' . $resourceId . ' not found :(', ] ); } } else { echo json_encode( $books ); } die; break; case 'POST': $json = file_get_contents('php://input'); $books[] = json_decode($json); echo array_keys($books)[count($books) - 1]; break; case 'PUT': if (!empty($resourceId) && array_key_exists($resourceId, $books)) { $json = file_get_contents('php://input'); $books[$resourceId] = json_decode($json, true); echo $resourceId; } break; case 'DELETE': if (!empty($resourceId) && array_key_exists($resourceId, $books)) { unset($books[$resourceId]); } break; default: header('Status-Code: 404'); echo json_encode( [ 'error' => $method . ' not yet implemented :(', ] ); break; }

código del router.php

<?php $matches = []; if (preg_match('/\/([^\/]+)\/([^\/]+)/', $_SERVER["REQUEST_URI"], $matches)) { $_GET['resource_type'] = $matches[1]; $_GET['resource_id'] = $matches[2]; error_log( print_r($matches, 1) ); require 'server.php'; } elseif ( preg_match('/\/([^\/]+)\/?/', $_SERVER["REQUEST_URI"], $matches) ) { $_GET['resource_type'] = $matches[1]; error_log( print_r($matches, 1) ); require 'server.php'; } else { error_log('No matches'); http_response_code( 404 ); }

código del auth_server.php

<?php $method = strtoupper($_SERVER['REQUEST_METHOD']); // $token = "5d0937455b6744.68357201"; $token = sha1('Esto es secreto!!'); if ($method === 'POST') { if (!array_key_exists('HTTP_X_CLIENT_ID', $_SERVER) || !array_key_exists('HTTP_X_SECRET', $_SERVER)) { http_response_code(400); die('Faltan parametros'); } $clientId = $_SERVER['HTTP_X_CLIENT_ID']; $secret = $_SERVER['HTTP_X_SECRET']; if ($clientId !== '1' || $secret !== 'SuperSecreto!') { http_response_code(403); die("No autorizado"); } echo "$token"; } elseif ($method === 'GET') { if (!array_key_exists('HTTP_X_TOKEN', $_SERVER)) { http_response_code(400); die('Faltan parametros'); } if ($_SERVER['HTTP_X_TOKEN'] == $token) { echo 'true'; } else { echo 'false'; } } else { echo 'false'; }

pasos para replicar el problema

  1. Los códigos anteriormente presentados, están metidos en una sola carpeta. Cada código presentado anteriormente está separado en archivos distintos:
  • server.php
  • router.php
  • auth_server.php
  1. En la terminal de linux se abre una pestaña para cada servidor y petición que se muestra a continuación

a. Se inicia el servidor router

$ php -S localhost:8000 router.php

b. Se inicia el servidor de autenticación

$ php -S localhost:80001 auth_server.php

c. Se realiza la petición al servidor de autenticación para pedir un token, el servidor crea el token y lo devuelvo en la terminal. Es token se debe copiar y enviarlo con la petición GET que se muestra en el siguiente paso

$ curl http : <//localhost> : 8001 -X ‘POST’ -H ‘X-CLIENT-Id:1’ -H ‘X-Secret:SuperSecreto!’

d. Se realiza la petición GET y se indica en la cabezare el token generado por el servidor de autenticación

$ curl http : // localhost : 8000/books -H ‘X-Token:c4b02a1525349e7888d4140dcd524aff2d6296dd’

e. finalmente después de la anterior consulta no se muestra nada.

El comportamiento esperado:

Mostrar la lista de libros.

El Comportamiento actual:

No muestra la lista de libros y en la pestaña donde se ejeucta el servidor de autenticación muesta el mensaje de:

[Wed Jun 2 12:42:21 2021] ::1:48248 Invalid request (Unsupported SSL request)

La caracterisitcas de mi de mi sistema

version de php

Captura de pantalla de 2021-06-02 12-45-57.png

especificaciones de mi sistema operativo

Captura de pantalla de 2021-06-02 12-43-53.png

4 respuestas
para escribir tu comentario
    Angel de Jesus Quintero Pereira

    Angel de Jesus Quintero Pereira

    studenthace 4 años

    Perdón, correción en el archivo server.php yo tengol a $url declara e inicializada con :

    $url = 'https ://localhost:8001';

    y debe ser

    $url = 'http :// localhost:8001';
    Angel de Jesus Quintero Pereira

    Angel de Jesus Quintero Pereira

    studenthace 4 años

    graciassssss ya entendiiiii jajajaja no había entendido al principio 😁😁😁😁😁😁😁😁...

    Para los que vean este comentario luego: La modificación que sugiere RetaxMaster es que el archivo server.php declaro una e inicializo una url, en esa petición debo quitar la s de https, es decir yo tengo:

    $url = 'https://localhost:8001';

    y debe ser :

    $url = 'https://localhost:8001';
    Angel de Jesus Quintero Pereira

    Angel de Jesus Quintero Pereira

    studenthace 4 años

    hola @RetaxMaster, nunca he usado la "s" para este tipo de petición. si te das cuenta en todo momento no usa la "s" en http

    Carlos Eduardo Gomez García

    Carlos Eduardo Gomez García

    teacherhace 4 años

    Quítale la "s" a "https" e inténtalo de nuevo ;)

    $url = 'https://localhost:8001';
Curso de API REST [Empieza Gratis]

Curso de API REST [Empieza Gratis]

Desarrolla APIs REST con PHP conectando aplicaciones y estructuras web. Aprende a implementar protocolos HTTP y REST, gestionar peticiones GET, POST y errores, y aplicar autenticación segura. Publica y accede a APIs en servidores.

Curso de API REST [Empieza Gratis]
Curso de API REST [Empieza Gratis]

Curso de API REST [Empieza Gratis]

Desarrolla APIs REST con PHP conectando aplicaciones y estructuras web. Aprende a implementar protocolos HTTP y REST, gestionar peticiones GET, POST y errores, y aplicar autenticación segura. Publica y accede a APIs en servidores.