
🔐 Apprenez l'authentification en la construisant correctement. Une implémentation de référence extensible et conforme aux normes pour Cloudflare Workers avec Hono, Turso, PBKDF2 et sessions à double jeton JWT.
Apprenez l'authentification en la construisant correctement.
Démo en direct · Modèle de menace · Flux d’authentification · ADR
Note de démo : L’endpoint de connexion est protégé par des défis PoW adaptatifs — les échecs répétés augmentent la difficulté de la preuve de travail. Un limiteur de débit basé sur le cache est implémenté et testé mais n’est pas activé sur la démo en direct ; activez
createCacheClientdansapp.tspour l’activer.
Une implémentation de référence d’authentification construite de zéro pour Cloudflare Workers — hachage de mot de passe PBKDF2, sessions à double jeton JWT, comparaison en temps constant, expiration glissante et un plugin d’observabilité amovible — le tout assemblé avec Hono, Turso (avec mise en cache optionnelle Valkey/Redis) et TypeScript strict.
Chaque choix de conception remonte à une norme : NIST SP 800-63B pour les identifiants, NIST SP 800-132 pour la dérivation de clés, OWASP ASVS pour la vérification, et RFC 8725 pour les bonnes pratiques JWT.
Vous livrez un produit ? Utilisez Better Auth à la place — il couvre OAuth, les clés d’accès, l’authentification multifacteur, la limitation de débit et bien plus encore prêts à l’emploi avec un écosystème de plugins actif. Ce dépôt existe pour vous apprendre comment fonctionne l’authentification, pas pour remplacer une bibliothèque de production.
Ce projet omet intentionnellement des fonctionnalités qui sortent de son cadre pédagogique. Si vous étendez ce code vers la production (ou évaluez ce qu’un système d’authentification de production nécessite), les tableaux ci-dessous organisent les lacunes par niveau de priorité.
Pour la plupart des projets réels, utilisez Better Auth plutôt que de construire vous-même ces fonctionnalités.
| Fonctionnalité | Pourquoi c’est important | Norme / Référence |
|---|---|---|
| Vérification des mots de passe compromis | Empêche l’utilisation de mots de passe connus dans les fuites publiques | NIST SP 800-63B §5.1.1.2, API HIBP |
Toutes ces raisons sont d’excellents motifs pour utiliser Better Auth à la place.
.
├── apps/
│ └── cloudflare-workers/ # Example Worker + Hono routes
├── packages/
│ ├── core/ # Auth services, middleware, crypto utilities
│ ├── infrastructure/ # DB client + utilities
│ ├── observability/ # Event emission, adaptive challenges, ops API (removable plugin)
│ ├── schemas/ # Zod schemas
│ └── types/ # Shared TypeScript types
├── tools/
│ └── cli/ # plctl — Go TUI for the /ops surface
└── docs/
├── adr/ # Architecture Decision Records
└── audits/ # Security audits
git clone https://github.com/vhscom/private-landing.git
cd private-landing
bun install
bun run dev
C'est tout — pas de comptes, pas de clés API, pas de fichiers .env. Le serveur de développement démarre avec une base de données SQLite locale et des secrets générés. Ouvrez http://localhost:8788 pour enregistrer un compte et explorer les flux d'authentification.
Vous avez un compte Turso ? Déposez un fichier
.dev.varsdansapps/cloudflare-workers/(voir.dev.vars.example) etbun run devutilisera automatiquement wrangler avec votre base de données distante. Utilisezbun run dev:localpour forcer le serveur local quoi qu’il arrive.
Voir CONTRIBUTING.md pour les instructions de test et de déploiement.
Ce dépôt inclut un fichier CLAUDE.md qui fournit un contexte pour les assistants IA. Lorsque vous utilisez Claude Code, Cursor ou des outils de développement alimentés par l’IA similaires :
CLAUDE.md pour le contexte du projetdocs/adr/ expliquent les choix de conceptiondocs/audits/ documentent la posture de sécuritéLe codebase est conçu pour être lisible par l’IA avec des limites de modules claires, des types complets et des noms descriptifs.
| Couche | Ce qu’elle fait |
|---|
| Stockage des mots de passe | PBKDF2-SHA384 avec sels de 128 bits, condensé d’intégrité, suivi de version (password-service.ts) |
| Gestion des sessions | Sessions côté serveur avec suivi d’appareil, expiration glissante, limite de 3 par utilisateur ; sessions optionnelles avec cache via Valkey/Redis (session-service.ts, cached-session-service.ts) |
| Changement de mot de passe | Re-vérification du mot de passe actuel, re-hachage PBKDF2 complet, révocation atomique de toutes les sessions (account-service.ts, ADR-004) |
| Schéma à double jeton JWT | Jeton d’accès de 15 min + jeton de rafraîchissement de 7 jours, liés à la session pour la révocation (token-service.ts) |
| Middleware d’authentification | Flux de rafraîchissement automatique, épinglage explicite HS256, validation de la revendication typ (require-auth.ts) |
| Cookies sécurisés | HttpOnly, Secure, SameSite=Strict, Path=/ (cookie.ts) |
| En-têtes de sécurité | HSTS, CSP, CORP/COEP/COOP, Permissions-Policy, suppression des empreintes (security.ts) |
| Validation des entrées | Schémas Zod avec politique de mot de passe conforme NIST (longueur uniquement, pas de règles de complexité) |
| Limitation de débit | Limitation à fenêtre fixe contre les attaques par force brute et par bourrage d’identifiants : IP sur les routes d’authentification publiques (ex. connexion), utilisateur sur les actions protégées ; pas de verrouillage définitif (conforme NIST) (ADR-006) |
| Plugin d’observabilité | Événements de sécurité structurés, défis PoW adaptatifs, API /ops authentifiée par agent — se branche via middleware, amovible en supprimant un paquet (ADR-008) |
| Outillage CLI | TUI Go (plctl) pour interroger les événements, gérer les sessions et provisionner les identifiants d’agent via l’interface /ops (tools/cli/) |
| Tests de vecteurs d’attaque | Altération JWT, confusion d’algorithme, confusion de type, cas limites Unicode, vérifications de divulgation d’informations |
| Fonctionnalité | Pourquoi c’est important | Norme / Référence |
|---|
| Protection CSRF (si SameSide relâché) | SameSite=Strict empêche actuellement le CSRF ; si changé en Lax pour l’UX, un jeton explicite est nécessaire | Aide-mémoire CSRF OWASP |
| Rotation des jetons de rafraîchissement | Détecte le vol de jeton — si un jeton de rafraîchissement remplacé est rejoué, révoque toute la famille de sessions | RFC 6819 §5.2.2.3 |
Revendication aud dans les JWT | Empêche un jeton d’un service d’être accepté par un autre partageant le même secret | RFC 7519 §4.1.3, RFC 8725 §3.9 |
| Nonces CSP pour les scripts en ligne | La CSP actuelle utilise 'unsafe-inline' ; les nonces éliminent les vecteurs XSS par script en ligne | MDN CSP script-src |
| Fonctionnalité | Pourquoi c’est important | Norme / Référence |
|---|
| Authentification multifacteur TOTP | Ajoute un second facteur pour les comptes à haute valeur | RFC 6238, NIST SP 800-63B §5.1.4 |
| WebAuthn / clés d’accès | Authentification résistante au phishing utilisant des authentificateurs de plateforme | WebAuthn Niveau 2 |
| OAuth / connexion sociale | Réduit les frictions, évite la fatigue des mots de passe | RFC 6749 |
| Liens magiques / OTP | Option sans mot de passe pour les flux à faible risque | NIST SP 800-63B §5.1.3 |
| Analyses de sessions | Suivi d’appareil, visibilité des sessions concurrentes, détection d’anomalies | Aide-mémoire OWASP sur la gestion des sessions |
| Rotation de la clé de signature | Permet une rotation périodique des secrets sans invalider toutes les sessions | RFC 7517 (JWK) |
| Fonctionnalité | Pourquoi c’est important | Norme / Référence |
|---|
| DPoP / liaison de jeton | Lie les jetons à la connexion TLS du client, empêchant la relecture après exfiltration | RFC 9449 (DPoP) |
| Multi-location | Isole les pools d’utilisateurs, les secrets et les politiques par locataire | Spécifique à l’application |
| Géorepérage / réputation IP | Bloque les connexions depuis des régions inattendues ou des IP malveillantes connues | OWASP ASVS v5.0 §6.3.5 |
| Authentification adaptative | Renforce les exigences d’authentification en fonction des signaux de risque (appareil, localisation, comportement) | NIST SP 800-63B §6 |
| Mise à niveau des itérations PBKDF2 ou Argon2id | OWASP recommande 210 000 itérations PBKDF2-SHA512 (Cloudflare limite à 100k) ; Argon2id est résistant en mémoire | Aide-mémoire OWASP sur le stockage des mots de passe |