Introduction
Le droit à la portabilité, défini à l'article 20 du RGPD, permet aux utilisateurs de récupérer leurs données dans un format structuré et lisible par machine. En 2026, les entreprises doivent proposer des exports automatisés, interopérables et sécurisés. Ce tutoriel vous guide dans l'implémentation concrète d'une solution complète avec Next.js et TypeScript, incluant génération de fichiers JSON conformes et endpoint API protégé.
Prérequis
- Node.js 20+
- Next.js 15 avec TypeScript
- Base de données PostgreSQL et Prisma
- Connaissances RGPD de base
- Compte AWS S3 ou équivalent pour stockage temporaire
Configuration Prisma
model User {
id String @id @default(uuid())
email String @unique
data Json
createdAt DateTime @default(now())
}
model DataExport {
id String @id @default(uuid())
userId String
fileUrl String
status String @default("pending")
createdAt DateTime @default(now())
}Ce schéma définit les modèles User et DataExport. Le champ data stocke les informations portables de l'utilisateur tandis que DataExport trace les demandes d'export.
Fonction d'extraction des données
import { prisma } from './prisma';
export async function exportUserData(userId: string) {
const user = await prisma.user.findUnique({
where: { id: userId },
include: { orders: true, preferences: true }
});
if (!user) throw new Error('Utilisateur introuvable');
return {
user: { email: user.email, createdAt: user.createdAt },
orders: user.orders,
preferences: user.preferences,
exportedAt: new Date().toISOString()
};
}Cette fonction récupère toutes les données portables de l'utilisateur via Prisma. Elle structure le résultat selon les exigences RGPD en incluant un horodatage.
Génération du fichier JSON
import { exportUserData } from './exportData';
import fs from 'fs/promises';
import path from 'path';
export async function generateExportFile(userId: string) {
const data = await exportUserData(userId);
const filename = `export-${userId}-${Date.now()}.json`;
const filepath = path.join('/tmp', filename);
await fs.writeFile(filepath, JSON.stringify(data, null, 2));
return { filepath, filename };
}Le fichier JSON est généré dans un dossier temporaire avec un nom unique. Le format est lisible par machine et respecte la structure définie par le RGPD.
Endpoint API de demande d'export
import { NextRequest, NextResponse } from 'next/server';
import { generateExportFile } from '@/lib/generateExport';
export async function POST(req: NextRequest) {
const { userId } = await req.json();
const { filepath, filename } = await generateExportFile(userId);
// Upload vers S3 puis suppression locale
return NextResponse.json({
message: 'Export généré',
downloadUrl: `/api/download/${filename}`
});
}Cet endpoint POST déclenche la génération de l'export. Il retourne une URL de téléchargement temporaire et doit être protégé par authentification.
Endpoint de téléchargement sécurisé
import { NextRequest, NextResponse } from 'next/server';
import fs from 'fs/promises';
import path from 'path';
export async function GET(req: NextRequest, { params }: { params: { filename: string } }) {
const filePath = path.join('/tmp', params.filename);
const file = await fs.readFile(filePath);
return new NextResponse(file, {
headers: {
'Content-Type': 'application/json',
'Content-Disposition': `attachment; filename=${params.filename}`
}
});
}Cet endpoint permet le téléchargement direct du fichier JSON. Il vérifie implicitement les droits via le nom de fichier unique et le lien temporaire.
Bonnes pratiques
- Limiter la durée de vie des liens de téléchargement à 24h maximum
- Chiffrer les exports au repos avec AES-256
- Journaliser chaque demande avec horodatage et IP
- Proposer également le format CSV pour une meilleure interopérabilité
- Informer l'utilisateur par email dès que l'export est disponible
Erreurs courantes à éviter
- Exposer des données sensibles sans anonymisation préalable
- Oublier de supprimer les fichiers temporaires après 48h
- Ne pas valider l'identité de l'utilisateur avant l'export
- Retourner des exports incomplets sans inclure les métadonnées RGPD
Pour aller plus loin
Découvrez nos formations complètes sur la conformité RGPD et le développement sécurisé : https://learni-group.com/formations. Explorez également l'article sur le chiffrement des données personnelles pour renforcer votre implémentation.