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 :
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
authentication:
method: in_memory
user_config_path: /shared/path/to/user_config.jsonlPotato é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) :
authentication:
method: database
database_url: "sqlite:///auth/users.db"PostgreSQL (nécessite psycopg2-binary) :
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 :
# Reset a specific user's password
potato reset-password config.yaml --username annotator1
# Prompted for new password interactivelyAPI d'administration
Réinitialisez par programme avec une clé d'API :
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 :
authentication:
method: database
database_url: "sqlite:///auth/users.db"
allow_password_reset: true
reset_token_ttl_hours: 24Marche à suivre côté administrateur :
# 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 annotatorMode 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 :
authentication:
method: in_memory
require_password: falseLes 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
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: annotatorPour aller plus loin
- SSO et OAuth — connexion via Google, GitHub ou le SSO de votre établissement
- Connexion sans mot de passe — accès par simple nom d'utilisateur pour les tâches ouvertes
- Configuration de production — HTTPS et configuration du reverse proxy
- Tableau de bord d'administration — gestion des comptes d'annotateurs
Pour les détails d'implémentation, consultez la documentation source.