Token d’authentification : générer un identifiant unique
Apprends à créer un token d’authentification court-vivant avec TypeScript, Zod, crypto et Prisma, puis à le stocker pour des cookies sécurisés et un backend.
Pourquoi un token plutot qu’un mot de passe en clair
Un token court–vivant limite la surface d’attaque.
Tu le glisses dans un cookie HTTP Only; le navigateur ne peut pas le lire via JS.
Si un pirate l’intercepte, sa durée de vie restreinte réduit l’impact.
Important
On ne stocke jamais un mot de passe en clair ni dans un cookie, ni dans la base.
Preparer la validation avec Zod
On accepte uniquement un email valide.
Zod rejette instantanément toute autre valeur et evite les injections SQL.
1import { z } from "zod";23export const GenerateTokenSchema = z.object({4email: z.string().email(),5});
Explications :
- z.object() construit le schema.
- z.string().email() impose un email RFC 5321.
- L’objet retourné servira a typer la fonction generateToken.
Generer un token aleatoire et securise
On mise sur la librairie standard crypto.
randomBytes garantit une entropie forte.
1import { randomBytes } from "node:crypto";23export function createRandomToken(): string {4return randomBytes(16).toString("hex");5}
Pourquoi 16 octets ?
- 16 octets = 128 bits d’entropie.
- Converti en hex, on obtient 32 caracteres lisibles.
- Suffisant pour une auth basee sur cookie a duree limitee.
Note
Si tu veux des tokens plus longs, augmente simplement la taille dans randomBytes.
Persister le token avec Prisma
On relie le token au user via la cle email.
Cela suppose une table authenticationToken avec une relation vers user.
1const created = await prisma.authenticationToken.create({2data: {3token,4user: {5connect: { email },6},7},8});
L’appel create possede deux effets :
- Insert un nouveau token.
- Associe le token au user existant sans requete supplementaire.
Fonction complete generateToken
On assemble le tout dans une fonction typee.
1import { prisma } from "../db.js";2import { GenerateTokenSchema } from "../validation/auth.ts";3import { createRandomToken } from "../lib/generate-token.ts";45export async function generateToken(6args: z.infer<typeof GenerateTokenSchema>,7) {8const { email } = GenerateTokenSchema.parse(args);910const token = createRandomToken();1112const created = await prisma.authenticationToken.create({13data: {14token,15user: {16connect: { email },17},18},19});2021return created.token;22}
Etapes :
- Parse et valide les arguments.
- Produit un token fort.
- Sauvegarde et relie le token.
- Retourne uniquement la chaine utile pour le cookie.
Tip
Ne retourne jamais l’objet complet; evite de divulguer l’id interne ou la date d’expiration.
Que faire apres avoir recu le token
- Met le token dans un cookie HTTP Only, Secure, SameSite=strict.
- Dans ton middleware, verifie le token et l’expiration avant d’autoriser la route.
- Revoque ou remplace le token a chaque connexion.
La prochaine lecon couvre la mise en place du cookie signe.
Quiz
Testez vos connaissances avec 5 questions
Quels avantages offre un token d’authentification court-vivant placé dans un cookie HTTP Only ?
Sélectionnez toutes les réponses qui s'appliquent
Dans GenerateTokenSchema, quelle règle Zod est appliquée à la propriété « email » ?
Quel nombre de caractères contient le token retourné par createRandomToken() avec randomBytes(16) converti en hexadécimal ?
Quel appel Prisma est utilisé pour enregistrer le token et le relier en une seule opération à l’utilisateur existant ?
Quel est le meilleur retour de la fonction generateToken() pour limiter les fuites d’information ?