Bottle-Cork es una biblioteca ligera de autenticación y autorización para aplicaciones web en Python construidas sobre el microframework Bottle. Le da a una pequeña aplicación autoalojada lo que de otro modo reimplementarías mal: cuentas de usuario, permisos por roles, cookies de sesión firmadas, registro y restablecimiento de contraseña. Esta guía explica cómo funciona Cork, cómo se compara con otras opciones de Python y cómo ejecutar de forma segura una app con autenticación en tu propio servidor.
Qué hace Bottle-Cork de un vistazo
| Capacidad | Cómo lo resuelve Cork |
|---|---|
| Cuentas de usuario | Usuario, contraseña con hash, correo, rol y datos de perfil arbitrarios |
| Autorización | Roles con nivel entero; los decoradores exigen un nivel mínimo |
| Sesiones | Cookies firmadas y con caducidad vía Beaker; sin almacén de sesión en servidor |
| Registro | Flujo de registro pendiente con token de confirmación por correo |
| Restablecer contraseña | Token firmado y con tiempo limitado enviado por correo |
| Backend de almacenamiento | Archivos JSON, MongoDB o SQLAlchemy |
Cómo funciona Cork
Cork se sitúa entre el enrutado de Bottle y tus manejadores. Cada petición protegida llama a un método de Cork que revisa la cookie de sesión, resuelve al usuario actual y permite ejecutar el manejador o aborta con una redirección al login. Usuarios, roles y registros pendientes viven en un backend que eliges al arrancar. Para una sola app pequeña basta con JSON; para escrituras concurrentes pasa a MongoDB o SQLAlchemy.
Los roles se ordenan por un nivel entero. Un admin de nivel 100 puede todo lo que puede un editor de nivel 50, y más. Los manejadores declaran el nivel mínimo requerido, así la autorización se expresa una vez, en la ruta, y no dispersa por la lógica de negocio.
Una app mínima con autenticación
from bottle import Bottle, request, redirect
from cork import Cork
from beaker.middleware import SessionMiddleware
aaa = Cork('conf_dir') # backend: users.json, roles.json, ...
app = Bottle()
@app.post('/login')
def login():
aaa.login(request.forms.get('user'),
request.forms.get('pwd'),
success_redirect='/dashboard',
fail_redirect='/login')
@app.route('/dashboard')
def dashboard():
aaa.require(fail_redirect='/login')
return 'Hello %s' % aaa.current_user.username
@app.route('/admin')
def admin():
aaa.require(role='admin', fail_redirect='/login')
return 'Admin area'
wrapped = SessionMiddleware(app, {'session.type': 'cookie',
'session.encrypt_key': 'CHANGE-ME',
'session.validate_key': True})
Dos ideas que llevarte aunque nunca uses Cork: la autorización va en la ruta con una sola llamada a require(), y la integridad de la sesión depende por completo de una clave secreta de firma que debe ser larga, aleatoria y estar fuera del árbol de código.
¿Buscas un servidor que simplemente funcione?
Valebyte VPS — NVMe, soporte 24/7, despliegue en 60 segundos.
Roles y autorización
Mantén pocos roles y con saltos de nivel amplios (por ejemplo 0 = privado, 30 = usuario, 60 = editor, 100 = admin). Los saltos amplios permiten insertar un nivel nuevo sin renumerar a todos. Nunca concedas poder por el nombre de usuario; comprueba el nivel del rol. Los nombres cambian, se suplantan en los tickets de soporte y se filtran en los logs.
Seguridad de contraseñas y sesiones
Cork guarda hashes de contraseñas, no contraseñas, y firma sus cookies de sesión. Eso es la base, no la meta. Exige una longitud mínima real de contraseña, limita la tasa del login contra el credential stuffing, caduca las sesiones con un tiempo sensato y rota la clave de firma si se expone. Sirve todo por HTTPS para que la cookie no se lea en la red y márcala como Secure y HttpOnly.
Bottle-Cork frente a otras opciones de Python
| Opción | Framework | Mejor para | Compromiso |
|---|---|---|---|
| Bottle-Cork | Bottle / WSGI | Apps autoalojadas pequeñas con roles sin base de datos | Ecosistema mínimo; el correo y el rate-limit los cableas tú |
| Flask-Login | Flask | Gestión de sesiones en apps Flask | Solo sesiones; roles y registro corren de tu cuenta |
| Authlib | Cualquiera | Proveedores y clientes OAuth2 / OpenID Connect | Más pesado; excesivo para una sola app interna |
| Django auth | Django | Apps completas que ya usan el ORM de Django | Adoptas todo el framework |
| Authelia / Keycloak | SSO independiente | Proteger varios servicios tras un único login | Un servicio aparte que hay que asegurar |
Si ya ejecutas más de un par de servicios autoalojados, un proveedor de identidad independiente como Keycloak suele ser mejor a largo plazo — consulta nuestra guía para instalar Keycloak para SSO e IAM. Para una sola app Bottle, Cork no estorba.
¿Buscas un servidor que simplemente funcione?
Valebyte VPS — NVMe, soporte 24/7, despliegue en 60 segundos.
Hardening del servidor detrás de tu login
La autenticación no es más fuerte que la máquina donde corre. Un login perfecto no sirve si el puerto de la base de datos está abierto a internet o un panel viejo responde en el 8080. Trata al host como parte del límite de autenticación:
- Firewall con default-deny. Expón solo el 443 (y SSH por clave, idealmente en una configuración no estándar). Herramientas en la tradición de Firelet, y hoy
nftablesoufw, permiten describir el tráfico permitido de forma explícita y auditarlo como un conjunto de reglas. - Fail2ban en los logs de login y SSH para banear fuentes de fuerza bruta.
- TLS en todo con renovación automática de certificados; redirige todo el HTTP a HTTPS.
- Un proxy inverso (nginx o Caddy) delante del proceso Python, para que la app no mire a internet directamente.
- Mínimo privilegio: ejecuta la app como usuario sin root y deja el archivo del backend legible solo por ese usuario.
Los primeros treinta minutos en una máquina nueva marcan el resto — nuestra lista para asegurar un servidor dedicado justo tras la entrega cubre firewall, SSH y actualizaciones en orden.
Qué servidor elegir para autoalojar tu app
En cuanto entran usuarios reales quieres CPU y memoria predecibles, una IP fija y control total del firewall — nada de eso lo da del todo el hosting compartido. Un servidor virtual privado sirve para una app ligera; un servidor dedicado es la opción correcta cuando guardas datos reales, ejecutas una base de datos o necesitas recursos garantizados sin vecinos ruidosos. Si el límite es el coste, un servidor dedicado económico igual te da el aislamiento y el control del firewall de los que depende la autenticación.
Bottle-Cork es pequeño, y esa es la clave: lo que importa no es la biblioteca, sino la disciplina alrededor — credenciales con hash, autorización por roles, sesiones firmadas y un host reforzado debajo. Hazlo bien y hasta una app Bottle de cien líneas es segura en internet abierto.