Skip to content
Learni
View all tutorials
Conformité & RGPD

Comment implémenter le droit à la portabilité en 2026

18 minINTERMEDIATE

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

prisma/schema.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

lib/exportData.ts
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

lib/generateExport.ts
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

app/api/portability/route.ts
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é

app/api/download/[filename]/route.ts
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.

Comment implémenter le droit à la portabilité en 2026 | Learni