Seed et gestion des mots de passe

Seed la base, sécurise les mots de passe avec bcryptjs.

3 min read

Accéder gratuitement à cette formation

Renseigne ton email pour débloquer immédiatement cette formation gratuite.

Dans cette leçon, tu vas apprendre à :

  1. Créer un script de seeding pour initialiser ta base SQLite.
  2. Hasher et comparer les mots de passe avec bcryptjs.
  3. Intégrer ce script dans tes commandes NPM.

On se concentre sur Prisma et la sécurité des mots de passe pour ton application Next.js 15.

Pourquoi seed et hashing ?

  • Seeding : peupler ta base de données avec des données de développement répétables.
  • Hashing : jamais stocker un mot de passe en clair !
  • Workflow : on définit le seed, on ajoute le hash, on l’intègre dans package.json, et on vérifie dans Prisma Studio.

1. Créer le fichier de seed

On place tout dans prisma/seed.ts. Ce script doit :

  • supprimer les utilisateurs existants (deleteMany).
  • créer un user avec mot de passe hashé.
prisma/seed.ts
1
import { PrismaClient } from '@prisma/client'
2
import { hashPassword } from '../app/server/auth'
3
4
const prisma = new PrismaClient()
5
6
async function main() {
7
// On vide la table pour éviter les doublons
8
await prisma.user.deleteMany()
9
10
// Création d'un utilisateur pré-enregistré
11
const password = await hashPassword({ password: 'ABC123' })
12
await prisma.user.create({
13
data: {
14
email: 'virgile@allobax.fr',
15
password,
16
},
17
})
18
19
console.log('🪴 Seed terminé !')
20
}
21
22
main()
23
.catch(e => {
24
console.error(e)
25
process.exit(1)
26
})
27
.finally(async () => {
28
await prisma.$disconnect()
29
})

2. Installer et configurer bcryptjs

On utilise bcryptjs pour le hashing.

Terminal
1
npm install bcryptjs

Ensuite, dans ton module d’authentification (app/server/auth.ts), on factorise deux fonctions :

app/server/auth.ts
1
import { hash, compare } from 'bcryptjs'
2
3
// Hachage avant stockage
4
export async function hashPassword({ password }: { password: string }) {
5
return await hash(password, 10)
6
}
7
8
// Comparaison lors du login
9
export async function comparePassword({
10
password,
11
hashedPassword,
12
}: {
13
password: string
14
hashedPassword: string
15
}) {
16
return await compare(password, hashedPassword)
17
}

10 rounds est un bon compromis dev/production.

3. Intégrer le seed dans package.json

Pour exécuter directement ton TypeScript via tsx, ajoute une dépendance dev :

Terminal
1
npm install -D tsx

Puis dans package.json :

package.json
1
"scripts": {
2
- "seed": "node prisma/seed.js"
3
+ "seed": "tsx prisma/seed.ts"
4
}

Maintenant, lance ton script :

Terminal
1
npm run seed

Ouvre Prisma Studio pour vérifier que ton utilisateur est bien créé :

Terminal
1
npx prisma studio

4. Mettre à jour le seed après hashing

Si tu as déjà seedé sans hashing, il faut :

prisma/seed.ts
1
- const rawPassword = 'ABC123'
2
- await prisma.user.create({
3
- data: { email: 'virgile@allobax.fr', password: rawPassword },
4
- })
5
+ const password = await hashPassword({ password: 'ABC123' })
6
+ await prisma.user.create({
7
+ data: { email: 'virgile@allobax.fr', password },
8
+ })

Cela garantit que la colonne password contient un hash, pas un texte en clair.

5. Récapitulatif des points clés

  1. Le seed est un script TS dans prisma/seed.ts.
  2. Hash le mot de passe avant prisma.user.create().
  3. Utilise bcryptjs (10 salt rounds).
  4. Commande npm run seed grâce à tsx.
  5. Vider la table avec deleteMany pour éviter les doublons.

Exercices rapides

  1. Ajouter un second user au seed : crée un utilisateur test@example.com
    avec mot de passe test123.
  2. Changer le salt factor dans hashPassword à 12 et observer le temps de seed.
  3. Créer un script npm run reseed qui supprime aussi la table HistoryItem
    pour repartir à zéro en dev.