Authentification
DocPlatform prend en charge l’authentification locale (e-mail + mot de passe) par défaut, avec la connexion OIDC Google et GitHub optionnelle pour les équipes utilisant ces fournisseurs.
Authentification locale (par défaut)
L’authentification locale fonctionne sans aucune configuration. Les utilisateurs s’inscrivent avec un e-mail et un mot de passe, et se connectent avec les mêmes identifiants.
Fonctionnement
- Inscription — L’utilisateur soumet e-mail + mot de passe. Le mot de passe est haché avec argon2id (algorithme recommandé par l’OWASP 2024).
- Connexion — L’utilisateur soumet ses identifiants. Le serveur vérifie le hash du mot de passe et renvoie des tokens JWT.
- Session — Le token d’accès (RS256, durée de vie de 15 minutes) est envoyé avec chaque requête API. Le token de rafraîchissement (durée de vie de 30 jours) est utilisé pour obtenir de nouveaux tokens d’accès sans ré-authentification.
Hachage du mot de passe
DocPlatform utilise argon2id avec les paramètres suivants (standard OWASP 2024) :
| Paramètre | Valeur |
|---|---|
| Algorithme | argon2id |
| Mémoire | 64 Mo |
| Itérations | 3 |
| Parallélisme | 4 |
| Longueur du sel | 16 octets |
| Longueur de la clé | 32 octets |
Ces paramètres ne sont pas configurables — ils suivent les bonnes pratiques de sécurité. Les hash de mots de passe sont stockés dans la base de données SQLite et ne quittent jamais le serveur.
Réinitialisation du mot de passe
Lorsqu’un utilisateur demande une réinitialisation de mot de passe :
- Avec SMTP configuré — un lien de réinitialisation à usage unique est envoyé par e-mail à l’utilisateur
- Sans SMTP — le token de réinitialisation est affiché sur stdout (journaux du serveur)
# Vérifier les journaux du serveur pour le token de réinitialisation
docplatform serve 2>&1 | grep "password reset"
Le token expire après 1 heure et ne peut être utilisé qu’une seule fois.
Tokens JWT
DocPlatform émet des JSON Web Tokens RS256 (RSA-SHA256) pour l’authentification.
Cycle de vie des tokens
User logs in
│
▼
┌─────────────────────────────────┐
│ Access Token (15 min) │ ──► Sent with every API request
│ Refresh Token (30 days) │ ──► Used to get new access tokens
└─────────────────────────────────┘
│
│ Access token expires
▼
┌─────────────────────────────────┐
│ POST /api/v1/auth/refresh │
│ Body: { refresh_token: "..." } │
└─────────────────────────────────┘
│
▼
┌─────────────────────────────────┐
│ New Access Token (15 min) │ ──► Old refresh token rotated
│ New Refresh Token (30 days) │ ──► Old one invalidated
└─────────────────────────────────┘
Rotation des tokens de rafraîchissement
Chaque fois qu’un token de rafraîchissement est utilisé, un nouveau token de rafraîchissement est émis et l’ancien est invalidé. Cela limite la fenêtre d’exposition en cas de compromission d’un token.
Configuration
| Variable | Par défaut | Description |
|---|---|---|
JWT_SECRET_PATH |
{DATA_DIR}/jwt-key.pem |
Chemin vers la clé privée RS256 |
JWT_ACCESS_TTL |
900 |
Durée de vie du token d’accès (secondes) |
JWT_REFRESH_TTL |
2592000 |
Durée de vie du token de rafraîchissement (secondes) |
Gestion des clés
La paire de clés RS256 est générée automatiquement au premier démarrage si le fichier n’existe pas. Pour effectuer une rotation des clés :
- Arrêtez le serveur
- Supprimez le fichier de clé (
{DATA_DIR}/jwt-key.pem) - Démarrez le serveur — une nouvelle clé est générée
Toutes les sessions existantes sont invalidées lors de la rotation des clés. Les utilisateurs doivent se reconnecter.
Connexion OIDC Google (optionnel)
Permettez aux utilisateurs de se connecter avec leur compte Google.
Configuration
- Rendez-vous sur la Google Cloud Console
- Créez un nouveau projet (ou utilisez un projet existant)
- Naviguez vers APIs & Services → Credentials
- Cliquez sur Create Credentials → OAuth 2.0 Client ID
- Type d’application : Web application
- Ajoutez l’URI de redirection autorisée :
https://your-domain.com/api/v1/auth/callback/google - Copiez l’identifiant client et le secret client
Définissez les variables d’environnement :
export OIDC_GOOGLE_CLIENT_ID=your-client-id.apps.googleusercontent.com
export OIDC_GOOGLE_CLIENT_SECRET=your-client-secret
Redémarrez le serveur. Un bouton Sign in with Google apparaît sur la page de connexion.
Provisionnement des utilisateurs
Lorsqu’un utilisateur se connecte via Google pour la première fois :
- Un compte DocPlatform est créé avec son e-mail Google
- Il se voit attribuer le rôle par défaut (
permissions.default_role) dans tout espace de travail auquel il est invité - Aucun mot de passe n’est défini (il peut en ajouter un plus tard depuis son profil)
Connexion OIDC GitHub (optionnel)
Permettez aux utilisateurs de se connecter avec leur compte GitHub.
Configuration
- Rendez-vous sur GitHub Developer Settings
- Cliquez sur New OAuth App
- Définissez l’URL de callback d’autorisation :
https://your-domain.com/api/v1/auth/callback/github - Copiez l’identifiant client et générez un secret client
Définissez les variables d’environnement :
export OIDC_GITHUB_CLIENT_ID=your-client-id
export OIDC_GITHUB_CLIENT_SECRET=your-client-secret
Redémarrez le serveur. Un bouton Sign in with GitHub apparaît sur la page de connexion.
Provisionnement des utilisateurs
Identique à Google — un compte DocPlatform est créé en utilisant l’e-mail principal de GitHub. Si le compte GitHub n’a pas d’e-mail public, l’utilisateur est invité à en saisir un.
Gestion des sessions
DocPlatform suit les sessions actives par utilisateur :
| Champ | Description |
|---|---|
| Appareil | Chaîne User-Agent |
| Adresse IP | IP du client (à des fins d’audit) |
| Créée | Quand la session a été établie |
| Dernière activité | Requête API la plus récente |
Les utilisateurs peuvent consulter et révoquer leurs sessions depuis leur page de profil. Les administrateurs peuvent consulter toutes les sessions depuis le panneau d’administration.
Révoquer des sessions
- Initiée par l’utilisateur — Profil → Sessions → Révoquer
- Initiée par l’administrateur — Admin → Users → sélectionner l’utilisateur → Revoke All Sessions
- Rotation des clés — La suppression de la clé JWT invalide toutes les sessions globalement
Politique de mot de passe
| Contrainte | Valeur |
|---|---|
| Longueur minimale | 8 caractères |
| Longueur maximale | 128 caractères |
| Hachage | argon2id (64 Mo de mémoire, 3 itérations, parallélisme 4) |
Les mots de passe sont validés lors de l’inscription et de la réinitialisation. DocPlatform n’impose pas d’exigences de classes de caractères (majuscules, caractères spéciaux) — la longueur est la principale mesure de sécurité conformément aux recommandations NIST actuelles.
Authentification WebSocket
Les connexions WebSocket utilisent un système de ticket à usage unique pour éviter d’exposer les tokens JWT dans les URLs (qui apparaîtraient dans les journaux du serveur et l’historique du navigateur).
Flux :
- Le client appelle
POST /api/v1/auth/ws-ticketavec un JWT valide - Le serveur renvoie un ticket aléatoire (valide pendant 30 secondes, usage unique)
- Le client se connecte à
ws://host/ws?ticket={ticket} - Le serveur valide le ticket, établit le WebSocket et supprime le ticket
Ceci est transparent pour les utilisateurs — l’éditeur web gère l’acquisition du ticket automatiquement.
Recommandations de sécurité
- Activez OIDC pour les équipes avec des comptes Google ou GitHub — déléguez la gestion des mots de passe à des fournisseurs établis
- Utilisez HTTPS en production — les tokens JWT sont des tokens porteur ; des tokens interceptés accordent un accès complet
- Gardez des durées de vie de token courtes — les tokens d’accès de 15 minutes limitent l’exposition
- Surveillez les sessions — consultez régulièrement les sessions actives pour détecter des appareils ou IPs inattendus
- Effectuez une rotation des clés annuellement ou après toute suspicion de compromission
- Utilisez des cookies HttpOnly — DocPlatform stocke les tokens dans des cookies HttpOnly + Secure + SameSite=Strict, empêchant le vol de tokens par XSS