Skip to content

Gestión de Contraseñas

Configura el hash de contraseñas con PBKDF2-SHA256, restablecimientos desde la CLI o la API de administración, flujos de autoservicio con token y almacenamiento de credenciales en SQLite o PostgreSQL en Potato.

Novedad en la v2.4.0

El sistema de autenticación de Potato usa PBKDF2-SHA256 con 100.000 iteraciones y una sal distinta por usuario, el mismo enfoque que recomienda el NIST para almacenar contraseñas de forma segura. Esta página explica cómo se guardan las contraseñas, cómo restablecerlas y cómo conservar las credenciales entre reinicios del servidor.

Implementación de Seguridad

Las contraseñas se guardan en formato salt$hash:

  • Sal hexadecimal de 32 caracteres, única para cada usuario
  • Hash SHA-256 de 64 caracteres de salt + password
  • Comparación en tiempo constante mediante hmac.compare_digest para evitar ataques de temporización

Las contraseñas en texto plano que ya existan en archivos user_config.jsonl se vuelven a hashear automáticamente con sales únicas cuando Potato las carga; no hace falta ninguna migración manual.

Configuración Predeterminada

De forma predeterminada, Potato usa autenticación en memoria. Los anotadores deben aparecer en la configuración:

yaml
authentication:
  method: in_memory
  require_password: true
 
user_config:
  users:
    - username: "annotator1"
      password: "initial-password"   # will be hashed on first load
    - username: "annotator2"
      password: "initial-password"

Credenciales Persistentes

Las credenciales en memoria se pierden al reiniciar. Para almacenarlas de forma persistente, usa un backend de archivo o de base de datos.

Persistencia en Archivo

yaml
authentication:
  method: in_memory
  user_config_path: /shared/path/to/user_config.jsonl

Potato escribe las credenciales hasheadas en este archivo y las vuelve a leer al reiniciar, de modo que las contraseñas creadas o cambiadas durante una sesión sobreviven a los reinicios.

Backend de Base de Datos

SQLite (sin dependencias adicionales):

yaml
authentication:
  method: database
  database_url: "sqlite:///auth/users.db"

PostgreSQL (requiere psycopg2-binary):

yaml
authentication:
  method: database
  database_url: "postgresql://user:password@localhost:5432/potato_auth"

Las tablas de la base de datos se crean automáticamente en el primer arranque.

Nota: method: database y user_config_path son mutuamente excluyentes; elige una sola estrategia de persistencia.

Restablecer Contraseñas

CLI de Administración

Restablece una contraseña desde la línea de comandos:

bash
# Reset a specific user's password
potato reset-password config.yaml --username annotator1
 
# Prompted for new password interactively

API de Administración

Restablece la contraseña mediante programación con una clave de API:

bash
curl -X POST http://localhost:8000/admin/reset_password \
  -H "X-API-Key: $ADMIN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"username": "annotator1", "new_password": "new-secure-password"}'

Restablecimiento de Autoservicio con Token

Potato admite un flujo de restablecimiento iniciado por el usuario. Los usuarios entran en /forgot-password, escriben su nombre de usuario y reciben un token de restablecimiento de un solo uso. Luego visitan /reset/<token> para definir una contraseña nueva.

Los tokens son válidos durante 24 horas y solo pueden usarse una vez. Potato no envía correos: la persona administradora distribuye el enlace de restablecimiento a mano.

Activarlo en la configuración:

yaml
authentication:
  method: database
  database_url: "sqlite:///auth/users.db"
  allow_password_reset: true
  reset_token_ttl_hours: 24

Flujo de trabajo del administrador:

bash
# Generate a reset token for a user
curl -X POST http://localhost:8000/admin/generate_reset_token \
  -H "X-API-Key: $ADMIN_API_KEY" \
  -d '{"username": "annotator1"}'
 
# Returns: {"reset_url": "https://your-server.com/reset/abc123..."}
# Share this URL with the annotator

Modo Sin Contraseña

Para demostraciones en clase, estudios rápidos o tareas que usan autenticación externa (MTurk, Prolific), puedes desactivar las contraseñas por completo:

yaml
authentication:
  method: in_memory
  require_password: false

Los anotadores escriben cualquier nombre de usuario para entrar y no aparece ninguna petición de contraseña. No es recomendable con datos sensibles ni en tareas que exijan identidad verificada.

Consulta Inicio de Sesión sin Contraseña para más detalles.

Referencia Completa

yaml
authentication:
  method: in_memory       # in_memory | database | oauth | clerk
 
  # In-memory options
  require_password: true
  user_config_path: path/to/users.jsonl   # optional persistence
 
  # Database options (mutually exclusive with user_config_path)
  database_url: "sqlite:///auth/users.db"
 
  # Self-service reset
  allow_password_reset: true
  reset_token_ttl_hours: 24
 
user_config:
  users:
    - username: "researcher"
      password: "secure-passphrase"
      role: admin
    - username: "annotator1"
      password: "initial-pass"
      role: annotator

Lectura Adicional

Para detalles de implementación, consulta la documentación fuente.