Modelo de seguridad de tokens
Los tokens L402 consisten en dos partes unidas por::
- Macaroon — JSON codificado en base64 que contiene
{hash, exp}. Firmado con SHA-256. No puede ser falsificado sin conocer el preimage. - Preimage — el secreto de 32 bytes que, al ser hasheado con SHA-256, debe coincidir con el hash embebido en el macaroon.
Protección contra repetición
l402-kit incluye protección contra repetición integrada. Cada preimage solo puede usarse una vez:401 Token already used.
Almacén por defecto: Set en memoria. Esto significa:
- Los reinicios limpian el almacén de repetición (los tokens se vuelven reutilizables entre reinicios)
- Múltiples instancias no comparten estado
Expiración de tokens
Los tokens llevan un campoexp (marca de tiempo Unix en ms). El SDK rechaza automáticamente los tokens expirados.
TTL por defecto: 1 hora (establecido por el proveedor Lightning al crear la factura).
HTTPS es obligatorio
Nunca uses L402 sobre HTTP plano en producción. El macaroon y el preimage se transmiten en el encabezadoAuthorization. Sobre HTTP, quedan expuestos a atacantes de red.
Limitación de velocidad
L402 verifica los tokens criptográficamente, sin consultar una base de datos — por lo que es económico. Pero la creación de facturas Lightning (la respuesta 402) llama a la API de tu proveedor Lightning. Protege la creación de facturas con un limitador de velocidad para prevenir DoS:Gestión de secretos
Nunca escribas claves API directamente en el código. Usa variables de entorno:.env + dotenv (nunca confirmado en git).
Autenticación de endpoints de administración
Si expones endpoints de administración o estadísticas, nunca aceptes secretos mediante parámetros de consulta en la URL. Las URLs son registradas en su totalidad por proxies inversos, CDNs y proveedores de nube — incluyendo la cadena de consulta.Higiene de claves de Supabase
UsaSUPABASE_SERVICE_KEY (solo del lado del servidor) frente a SUPABASE_ANON_KEY (seguro para exponer a clientes) correctamente:
| Clave | Uso | ¿Omite RLS? |
|---|---|---|
anon | Extensión de VS Code, clientes de navegador | No |
service_role | Funciones API del lado del servidor | Sí |
pro_access) deben usar la clave de servicio — nunca la clave anon. Las políticas RLS en tablas sensibles no deben otorgar acceso anon.
Política de Seguridad de Contenido
Si sirves un frontend junto a tu API, asegúrate de que tu CSP no bloquee el flujo L402:Gestión de datos — eliminación de datos de usuario
Los usuarios pueden eliminar todo su historial de pagos y suscripción Pro desde la extensión de VS Code en cualquier momento (Ajustes → Zona de Peligro). La extensión llama a:- Todas las filas en
paymentsdondeowner_address = ? - Todas las filas en
pro_accessdondeaddress = ?
La extensión requiere que el usuario escriba su dirección Lightning tal cual antes de que el botón de eliminar se habilite — confirmación al estilo GitHub para acciones destructivas.
Privacidad y minimización de datos
l402-kit está diseñado para recopilar el mínimo de datos necesarios para operar. A continuación se detalla qué se almacena, por qué y cómo reforzar cada campo.Qué se almacena
| Tabla | Campo | Por qué | Sensibilidad |
|---|---|---|---|
payments | preimage | Protección contra repetición + prueba de pago | ⚠️ Media — hashéalo en su lugar (ver abajo) |
payments | owner_address | Atribuir ingresos a la dirección Lightning | Baja — las direcciones Lightning son públicas |
payments | amount_sats | Estadísticas del panel | Baja |
payments | endpoint | Análisis por endpoint | Baja–media |
pro_access | address | Verificar suscripción Pro | Baja — pública |
waitlist | email | Enviar correos de bienvenida y lanzamiento | ⚠️ Alta — PII real, cifrar u omitir |
waitlist | lightning_address | Señal de identidad opcional | Baja |
Hashear preimages en lugar de almacenarlos en crudo
El preimage es el secreto de 32 bytes que demuestra que se realizó un pago Lightning. Almacenarlo en crudo significa que una brecha de base de datos expone cada prueba. Almacena el hash SHA-256 en su lugar — ya es público (embebido en la factura BOLT11) y suficiente para la protección contra repetición:Proteger correos electrónicos de la lista de espera
Las direcciones de correo electrónico son la única PII verdadera en el sistema. Opciones en orden de protección creciente:Demostrar la propiedad de la billetera antes de eliminar datos (LNURL-auth)
El endpoint/api/delete-data solo debe aceptar solicitudes del propietario real de la dirección Lightning. Usa LNURL-auth para demostrar la propiedad criptográficamente — el usuario firma un desafío del servidor con la clave privada de su billetera Lightning, sin contraseña ni cuenta requerida:
Consulta el diagrama de flujo completo para la secuencia completa con el estado de Supabase.
Esto garantiza que nadie pueda eliminar los registros de otro usuario, incluso si conoce la dirección Lightning.
Lista de verificación
Antes de salir en producción
Antes de salir en producción
- HTTPS aplicado en todos los endpoints
- Claves API en variables de entorno, no en el código fuente
- Endpoints de administración/estadísticas usan autenticación por encabezado, no parámetros
?secret=en la URL - Clave
service_rolede Supabase usada del lado del servidor; claveanonsolo en clientes - Las tablas sensibles de Supabase no tienen política SELECT para
anon - El endpoint de eliminación de datos (
/api/delete-data) usa la clave de servicio, nunca la anon - Limitador de velocidad en la creación de facturas
- Protección contra repetición probada (intentar reutilizar un preimage → esperar 401)
- Expiración de tokens probada (establecer TTL corto en desarrollo, confirmar 401 tras la expiración)
- Preimages almacenados como hashes SHA-256, no como secretos en crudo
- Correos electrónicos de la lista de espera cifrados en reposo o descartados tras el envío
-
/api/delete-datarequiere prueba LNURL-auth de propiedad de la billetera
Para APIs de alto tráfico
Para APIs de alto tráfico
- Almacén de repetición respaldado por Redis (compartido entre instancias)
- Monitoreo de tasas de respuesta 402 (un pico = posible DoS)
- Conmutación por error del proveedor Lightning (BlinkProvider → respaldo con LNbitsProvider)
- Monitoreo de la página de estado de tu proveedor Lightning (p. ej. status.blink.sv)