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:
$clientes = ModeloClientes::index("clientes");Recupera todos los clientes registrados desde la base de datos
2. Verificar credenciales:
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:
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_clienteactúa como usuariollave_secretaactúa como contraseñaCodifica en Base64 para comparar con el formato HTTP Basic Auth
Problemas con este enfoque:
Ineficiente: Recorre TODOS los clientes para cada solicitud
Sin token: Still using basic auth (usuario:contraseña en cada request)
Falta manejo de errores: No hay respuesta para credenciales inválidas
Versión mejorada con validación real:
// 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:
// 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
Publicar un comentario