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.
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.
On ne stocke jamais un mot de passe en clair ni dans un cookie, ni dans la base.
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 :
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 ?
Si tu veux des tokens plus longs, augmente simplement la taille dans randomBytes.
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 :
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 :
Ne retourne jamais l’objet complet; evite de divulguer l’id interne ou la date d’expiration.
La prochaine lecon couvre la mise en place du cookie signe.
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 ?