II-Solicitando TOKEN de Autorización en PHP

 

¿Qué hace este código?

Este código implementa autenticación básica HTTP pero comparando las credenciales con una base de datos de clientes. Aún no es un sistema de tokens, pero se acerca más.

Explicación detallada:

1. Obtener clientes de la base de datos:

php
$clientes = ModeloClientes::index("clientes");
  • Recupera todos los clientes registrados desde la base de datos

2. Verificar credenciales:

php
if(isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])){
  • Comprueba si se enviaron usuario y contraseña en los headers

3. Validación contra la base de datos:

php
foreach ($clientes as $key => $valueCliente) {
    if( "Basic ".base64_encode($_SERVER['PHP_AUTH_USER'].":".$_SERVER['PHP_AUTH_PW']) ==
        "Basic ".base64_encode($valueCliente["id_cliente"].":".$valueCliente["llave_secreta"])) {
        // Autenticación exitosa
    }
}
  • Compara las credenciales recibidas con cada cliente en la base de datos

  • id_cliente actúa como usuario

  • llave_secreta actúa como contraseña

  • Codifica en Base64 para comparar con el formato HTTP Basic Auth

Problemas con este enfoque:

  1. Ineficiente: Recorre TODOS los clientes para cada solicitud

  2. Sin token: Still using basic auth (usuario:contraseña en cada request)

  3. Falta manejo de errores: No hay respuesta para credenciales inválidas

Versión mejorada con validación real:

php
// Obtener todos los clientes
$clientes = ModeloClientes::index("clientes");

// Verificar si se enviaron credenciales
if(!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW'])) {
    header('WWW-Authenticate: Basic realm="API Realm"');
    header('HTTP/1.0 401 Unauthorized');
    echo json_encode(["error" => "Credenciales requeridas"]);
    exit;
}

// Buscar cliente específico (MUCHO más eficiente)
$clienteEncontrado = null;
foreach ($clientes as $cliente) {
    if($cliente["id_cliente"] == $_SERVER['PHP_AUTH_USER'] && 
       $cliente["llave_secreta"] == $_SERVER['PHP_AUTH_PW']) {
        $clienteEncontrado = $cliente;
        break; // Salir del loop cuando se encuentra
    }
}

// Validar credenciales
if($clienteEncontrado) {
    // AUTENTICACIÓN EXITOSA
    $cursos = ModeloCursos::index("cursos");
    
    $json = array(
        "status" => 200,
        "total_registros" => count($cursos),
        "detalle" => $cursos
    );
    
    echo json_encode($json, true);
    
} else {
    // CREDENCIALES INVÁLIDAS
    header('HTTP/1.0 401 Unauthorized');
    echo json_encode(["error" => "Credenciales inválidas"]);
}

Para implementar TOKENS reales:

Sistema de tokens JWT recomendado:

php
// Después de validar credenciales exitosamente:
if($clienteEncontrado) {
    // Generar token JWT
    $token = generarJWT($clienteEncontrado["id_cliente"]);
    
    // Devolver token al cliente
    $json = array(
        "status" => 200,
        "token" => $token,
        "expira_en" => time() + 3600 // 1 hora
    );
    
    echo json_encode($json, true);
    
} else {
    http_response_code(401);
    echo json_encode(["error" => "Credenciales inválidas"]);
}

¿Te gustaría que te explique cómo implementar un sistema completo de tokens JWT? Esto sería el siguiente paso lógico después de esta autenticación básica.

Comentarios

Entradas más populares de este blog

token

¿Qué es un token y cómo se utiliza en una API?

Generación de Credenciales API