Skip to content

Gestion des mots de passe

Configurez le hachage PBKDF2-SHA256 des mots de passe, les réinitialisations par CLI ou API admin, les parcours de réinitialisation en libre-service par jeton, et le stockage des identifiants en SQLite ou PostgreSQL dans Potato.

Nouveau dans la v2.4.0

Le système d'authentification de Potato utilise PBKDF2-SHA256 avec 100 000 itérations et un sel propre à chaque utilisateur, l'approche que le NIST recommande pour le stockage sécurisé des mots de passe. Cette page explique comment les mots de passe sont stockés, comment les réinitialiser, et comment conserver les identifiants d'un redémarrage du serveur à l'autre.

Mise en œuvre de la sécurité

Les mots de passe sont stockés au format salt$hash :

  • Un sel hexadécimal de 32 caractères, unique par utilisateur
  • Un hash SHA-256 de 64 caractères de salt + password
  • Une comparaison à temps constant via hmac.compare_digest, qui écarte les attaques temporelles

Les mots de passe en clair présents dans les fichiers user_config.jsonl sont re-hachés automatiquement avec des sels uniques au chargement par Potato. Aucune migration manuelle n'est nécessaire.

Configuration par défaut

Par défaut, Potato utilise une authentification en mémoire. Les annotateurs doivent figurer dans la configuration :

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"

Identifiants persistants

Les identifiants en mémoire sont perdus au redémarrage. Pour un stockage durable, utilisez un fichier ou une base de données.

Persistance par fichier

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

Potato écrit les identifiants hachés dans ce fichier et les relit au redémarrage. Les mots de passe définis ou modifiés pendant une session survivent donc aux redémarrages.

Base de données

SQLite (aucune dépendance supplémentaire) :

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

PostgreSQL (nécessite psycopg2-binary) :

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

Les tables sont créées automatiquement au premier démarrage.

Remarque : method: database et user_config_path s'excluent mutuellement. Choisissez une seule stratégie de persistance.

Réinitialiser les mots de passe

CLI d'administration

Réinitialisez un mot de passe en ligne de commande :

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

API d'administration

Réinitialisez par programme avec une clé d'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"}'

Réinitialisation en libre-service par jeton

Potato propose un parcours de réinitialisation lancé par l'utilisateur. L'utilisateur se rend sur /forgot-password, saisit son nom d'utilisateur et reçoit un jeton de réinitialisation à usage unique. Il ouvre ensuite /reset/<token> pour définir un nouveau mot de passe.

Les jetons sont valables 24 heures et ne servent qu'une fois. Potato n'envoie pas d'e-mails : l'administrateur distribue le lien de réinitialisation lui-même.

Activation dans la configuration :

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

Marche à suivre côté administrateur :

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

Mode sans mot de passe

Pour des démonstrations en classe, des études rapides, ou des tâches qui reposent sur une authentification externe (MTurk, Prolific), vous pouvez désactiver complètement les mots de passe :

yaml
authentication:
  method: in_memory
  require_password: false

Les annotateurs se connectent avec n'importe quel nom d'utilisateur, sans invite de mot de passe. À éviter pour des données sensibles ou des tâches qui exigent une identité vérifiée.

Voir Connexion sans mot de passe pour les détails.

Référence complète

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

Pour aller plus loin

Pour les détails d'implémentation, consultez la documentation source.