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.

3 min read

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.

Preparer la validation avec Zod

On accepte uniquement un email valide.
Zod rejette instantanément toute autre valeur et evite les injections SQL.

src/validation/auth.ts
1
import { z } from "zod";
2
3
export const GenerateTokenSchema = z.object({
4
email: z.string().email(),
5
});

Explications :

  1. z.object() construit le schema.
  2. z.string().email() impose un email RFC 5321.
  3. L’objet retourné servira a typer la fonction generateToken.

Zod - Documentation

Generer un token aleatoire et securise

On mise sur la librairie standard crypto.
randomBytes garantit une entropie forte.

lib/generate-token.ts
1
import { randomBytes } from "node:crypto";
2
3
export function createRandomToken(): string {
4
return 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.

Node.js crypto

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.

prisma/seed.ts
1
const created = await prisma.authenticationToken.create({
2
data: {
3
token,
4
user: {
5
connect: { email },
6
},
7
},
8
});

L’appel create possede deux effets :

  1. Insert un nouveau token.
  2. Associe le token au user existant sans requete supplementaire.

Prisma - create()

Fonction complete generateToken

On assemble le tout dans une fonction typee.

services/auth.ts
1
import { prisma } from "../db.js";
2
import { GenerateTokenSchema } from "../validation/auth.ts";
3
import { createRandomToken } from "../lib/generate-token.ts";
4
5
export async function generateToken(
6
args: z.infer<typeof GenerateTokenSchema>,
7
) {
8
const { email } = GenerateTokenSchema.parse(args);
9
10
const token = createRandomToken();
11
12
const created = await prisma.authenticationToken.create({
13
data: {
14
token,
15
user: {
16
connect: { email },
17
},
18
},
19
});
20
21
return created.token;
22
}

Etapes :

  1. Parse et valide les arguments.
  2. Produit un token fort.
  3. Sauvegarde et relie le token.
  4. Retourne uniquement la chaine utile pour le cookie.

Que faire apres avoir recu le token

  1. Met le token dans un cookie HTTP Only, Secure, SameSite=strict.
  2. Dans ton middleware, verifie le token et l’expiration avant d’autoriser la route.
  3. 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

1Question 1 sur 5

Quels avantages offre un token d’authentification court-vivant placé dans un cookie HTTP Only ?

Sélectionnez toutes les réponses qui s'appliquent

2Question 2 sur 5

Dans GenerateTokenSchema, quelle règle Zod est appliquée à la propriété « email » ?

3Question 3 sur 5

Quel nombre de caractères contient le token retourné par createRandomToken() avec randomBytes(16) converti en hexadécimal ?

4Question 4 sur 5

Quel appel Prisma est utilisé pour enregistrer le token et le relier en une seule opération à l’utilisateur existant ?

5Question 5 sur 5

Quel est le meilleur retour de la fonction generateToken() pour limiter les fuites d’information ?