Settings — Seguridad¶
En esta sección puedes reforzar la seguridad de tu cuenta activando la autenticación en dos pasos (2FA) con códigos temporales (TOTP) y administrar las sesiones abiertas en tus dispositivos.
La pantalla está implementada en resources/js/pages/settings/security.tsx
y requiere Laravel Fortify.
Requisitos previos¶
- Estar autenticado.
- Fortify instalado y configurado (rutas
/user/two-factor-*
). - Rate limiter para
two-factor
(evita fuerza bruta de TOTP).
Autenticación en dos pasos (TOTP)¶
La verificación en dos pasos añade un código extra (TOTP) generado por una app como Google Authenticator o Authy. Este código cambia cada 30s.
Habilitar 2FA¶
- Abre
Ajustes
→Seguridad
. - Pulsa
Habilitar 2FA
. - Pulsa
Mostrar código QR
y escanéalo con tu app TOTP. - Ingresa el código de 6 dígitos en el Input OTP y pulsa
Confirmar 2FA
. - Verás una insignia
2FA activa
con la fecha de confirmación.
Input OTP
La pantalla usa un input de tipo OTP con 6 casillas. Puedes pegar los 6 dígitos y el componente los distribuirá automáticamente.
Códigos de recuperación¶
Al habilitar 2FA se generan códigos de recuperación de un solo uso para cuando no tengas acceso a tu app TOTP.
- Botón
Ver códigos de recuperación
. - Acciones disponibles:
Copiar
al portapapeles.Descargar
como archivo de texto con nombreappName-recovery-codes-YYYY-MM-DD.txt
.Regenerar códigos
(requiere confirmación). Los anteriores quedan invalidados.
Guárdalos en lugar seguro
Los códigos de recuperación son tu respaldo para entrar si pierdes tu teléfono. Consérvalos en tu gestor de contraseñas.
Deshabilitar 2FA¶
- Pulsa
Deshabilitar 2FA
y confirma. Por seguridad, se te pedirá la contraseña antes de completar la acción.
Sesiones activas¶
En esta sección ves todas las sesiones abiertas con tu cuenta, agrupadas por IP + dispositivo/navegador.
- Cada fila muestra:
- Icono del dispositivo (desktop o mobile) derivado del
User-Agent
. - IP de la sesión.
- Ubicación aproximada (GeoIP) con un pin.
- Fecha/hora de última actividad.
- Icono del dispositivo (desktop o mobile) derivado del
- Acciones disponibles:
Refrescar
la lista.Cerrar
una sesión específica (no la actual).Cerrar todas (excepto esta)
con confirmación y verificación de contraseña.
Privacidad y precisión
Para IPs privadas (por ejemplo 192.168.x.y
) se muestra "Red privada" o "Localhost". La ubicación aproximada se cachea en localStorage para evitar llamadas repetidas.
Manejo de límites (429)¶
Si haces demasiadas peticiones (por ejemplo, QR/códigos seguidos), el sistema puede responder con 429 Too Many Requests.
- Verás un contador de enfriamiento indicando en cuántos segundos puedes reintentar.
- La UI evita envíos mientras el contador está activo.
Solución de problemas¶
- 2FA no funciona o las políticas devuelven 403:
- Verifica que
AuthServiceProvider
está registrado enbootstrap/providers.php
(Laravel 11/12 requiere registro explícito para cargar policies).
- Verifica que
- El login de un usuario inactivo muestra el mensaje estándar y no el personalizado:
- En este proyecto,
FortifyServiceProvider
personaliza el flujo para devolverauth.inactive
cuando el usuario existe pero está inactivo.
- En este proyecto,
- La ubicación no aparece:
- Puede deberse a CORS del proveedor GeoIP o a que la IP es privada. Se muestra
Ubicación desconocida
de forma segura.
- Puede deberse a CORS del proveedor GeoIP o a que la IP es privada. Se muestra
Accesibilidad y UX¶
- Componentes y botones con
focus-visible
yaria-label
donde procede. - Insignias de estado:
Inactiva
,Pendiente de confirmación
,2FA activa
. - Diálogos de confirmación para acciones destructivas (
Deshabilitar 2FA
,Regenerar códigos
,Cerrar todas
).
Referencias¶
- Frontend:
resources/js/pages/settings/security.tsx
- Controladores:
app/Http/Controllers/Settings/SecurityController.php
,app/Http/Controllers/Settings/SessionsBrowserController.php
- Fortify:
app/Providers/FortifyServiceProvider.php
- Rate limiting:
app/Providers/AppServiceProvider.php