PWR Umbral
Motor de autenticacion segura en PHP puro. Hash Argon2id, TOTP nativo (RFC 6238), bloqueo por intentos fallidos, recuperacion de password y autenticacion en dos factores. Almacenamiento en JSON, sin base de datos ni dependencias externas.
Instalacion
Umbral es un unico archivo PHP. Incluirlo en tu proyecto para disponer de todas las funciones de autenticacion.
require_once __DIR__ . '/core/umbral.php';
Requisitos minimos
- PHP 7.4 o superior
- Extension
sodium(para Argon2id, incluida en PHP 7.2+) - Permisos de escritura en
datos/para almacenamiento de usuarios
Inicio rapido
Registro, login y verificacion de sesion en pocas lineas.
require_once 'core/umbral.php';
// Registrar un usuario
$reg = pwr_umbral_registrar('usuario@ejemplo.com', 'MiPassword_Seguro123');
// Iniciar sesion
$login = pwr_umbral_login('usuario@ejemplo.com', 'MiPassword_Seguro123');
// Verificar sesion activa
$sesion = pwr_umbral_verificar();
Funciones
pwr_umbral_registrar()
Registra un nuevo usuario con hash Argon2id. Valida formato de email y fortaleza del password.
pwr_umbral_registrar(string $email, string $password): array
| Parametro | Tipo | Descripcion |
|---|---|---|
$email | string | Email del usuario (se usa como identificador unico) |
$password | string | Password en texto plano (se almacena como hash Argon2id) |
Retorna: array con ok (bool), id (string) y mensaje (string).
pwr_umbral_login()
Inicia sesion verificando credenciales. Comprueba bloqueo por intentos fallidos antes de validar.
pwr_umbral_login(string $email, string $password): array
| Parametro | Tipo | Descripcion |
|---|---|---|
$email | string | Email del usuario |
$password | string | Password en texto plano |
Retorna: array con ok (bool), usuario (datos seguros sin hash) y mensaje. Si tiene 2FA activo, incluye requiere_2fa.
pwr_umbral_logout()
Cierra la sesion activa y destruye los datos de sesion.
pwr_umbral_logout(): array
Retorna: array con ok (bool) y mensaje.
pwr_umbral_verificar()
Verifica si hay una sesion activa y valida. Comprueba que el usuario exista y la sesion no haya expirado.
pwr_umbral_verificar(): array
Retorna: array con ok (bool), usuario (datos seguros) y mensaje.
pwr_umbral_bloqueo_intentos()
Comprueba si un email tiene bloqueados los intentos de login por exceso de fallos.
pwr_umbral_bloqueo_intentos(string $email): array
| Parametro | Tipo | Descripcion |
|---|---|---|
$email | string | Email del usuario a comprobar |
Retorna: array con bloqueado (bool), intentos (int), max_intentos (int) y minutos_restantes (int).
pwr_umbral_recuperar_password()
Genera un token de recuperacion de password con expiracion configurable.
pwr_umbral_recuperar_password(string $email): array
| Parametro | Tipo | Descripcion |
|---|---|---|
$email | string | Email del usuario que solicita recuperacion |
Retorna: array con ok (bool), token (string) y expira (datetime). El token debe enviarse por email al usuario.
pwr_umbral_cambiar_password()
Cambia el password de un usuario usando un token de recuperacion valido.
pwr_umbral_cambiar_password(string $token, string $nueva): array
| Parametro | Tipo | Descripcion |
|---|---|---|
$token | string | Token de recuperacion generado por pwr_umbral_recuperar_password() |
$nueva | string | Nueva password en texto plano |
Retorna: array con ok (bool) y mensaje.
pwr_umbral_2fa_generar()
Genera un secreto TOTP para activar la autenticacion en dos factores. Devuelve el secreto y la URI para generar QR.
pwr_umbral_2fa_generar(string $usuario_id): array
| Parametro | Tipo | Descripcion |
|---|---|---|
$usuario_id | string | ID del usuario al que activar 2FA |
Retorna: array con ok (bool), secreto (string base32), uri (string otpauth://) y mensaje.
pwr_umbral_2fa_verificar()
Verifica un codigo TOTP de 6 digitos contra el secreto almacenado del usuario.
pwr_umbral_2fa_verificar(string $usuario_id, string $codigo): array
| Parametro | Tipo | Descripcion |
|---|---|---|
$usuario_id | string | ID del usuario |
$codigo | string | Codigo TOTP de 6 digitos desde la app autenticadora |
Retorna: array con ok (bool) y mensaje.
pwr_umbral_info()
Devuelve informacion del modulo: version, algoritmo de hash, estado de extensiones y configuracion activa.
pwr_umbral_info(): array
Retorna: array con version, hash_algoritmo, 2fa_disponible, usuarios_total.
Configuracion
La configuracion se almacena en datos/umbral_config.json.
Si no existe, Umbral usa valores por defecto seguros.
{
"max_intentos": 5, // Intentos fallidos antes de bloquear
"ventana_bloqueo_minutos": 15, // Duracion del bloqueo en minutos
"token_expiracion_horas": 1, // Expiracion del token de recuperacion
"totp_digitos": 6, // Digitos del codigo TOTP
"totp_periodo": 30, // Periodo de rotacion TOTP en segundos
"totp_ventana": 1, // Ventanas adyacentes aceptadas (+/- 1)
"sesion_duracion_horas": 24, // Duracion de la sesion en horas
"log_activado": true, // Registrar eventos en log
"log_ruta": "logs/umbral.log" // Ruta del archivo de log
}
Ejemplos
Flujo completo de registro y login
require_once 'core/umbral.php';
// 1. Registrar usuario
$reg = pwr_umbral_registrar('admin@miapp.com', 'Segura_2024!');
if (!$reg['ok']) {
die('Error: ' . $reg['mensaje']);
}
// 2. Login
$login = pwr_umbral_login('admin@miapp.com', 'Segura_2024!');
if ($login['ok']) {
echo 'Bienvenido, ' . $login['usuario']['email'];
}
Proteger una pagina con sesion
require_once 'core/umbral.php';
$sesion = pwr_umbral_verificar();
if (!$sesion['ok']) {
header('Location: /login.php');
exit;
}
// El usuario esta autenticado
echo 'Hola, ' . $sesion['usuario']['email'];
Activar autenticacion en dos factores
require_once 'core/umbral.php';
// Generar secreto TOTP para el usuario
$totp = pwr_umbral_2fa_generar($usuario_id);
if ($totp['ok']) {
// Mostrar URI para generar QR en la app
echo 'Configura tu app con esta URI: ' . $totp['uri'];
}
// Verificar codigo TOTP del usuario
$verificacion = pwr_umbral_2fa_verificar($usuario_id, $_POST['codigo_totp']);
if ($verificacion['ok']) {
echo 'Codigo 2FA valido';
}
Recuperacion de password
require_once 'core/umbral.php';
// Generar token de recuperacion
$recuperar = pwr_umbral_recuperar_password('usuario@ejemplo.com');
if ($recuperar['ok']) {
// Enviar token por email al usuario
$token = $recuperar['token'];
// mail($email, 'Recuperar password', "Token: $token");
}
// Cuando el usuario envie el token + nueva password
$cambio = pwr_umbral_cambiar_password($_POST['token'], $_POST['nueva_password']);
echo $cambio['mensaje'];