Back-end · 5 mondes · 15 étapes

API avec Node

Construire une API qui répond juste, valide ce qu'elle reçoit et se protège.

Progression

0 %

0/15 étapes terminées

Avancé · 10 min de lecture

Sécurité des API

Authentifier, autoriser, limiter

1Définition

Une API protégée répond à trois questions pour chaque requête : qui appelle (authentification, sinon 401), en a-t-il le droit (autorisation, sinon 403), abuse-t-il (limitation de débit, sinon 429). Les middlewares appliquent ces contrôles une fois pour toutes les routes.

2Principes fondamentaux

01

401 contre 403

401 : on ne sait pas qui vous êtes. 403 : on le sait, et c'est non.

02

Protéger par défaut

Une route cachée n'est pas une route protégée : les adresses se devinent et s'énumèrent.

03

Contrôler l'appartenance

Un joueur connecté ne doit lire que ses quêtes : vérifier l'identité ne suffit pas, il faut vérifier la propriété.

04

Des middlewares composables

avecJournal(avecLimite(avecAuth(route))) : chaque contrôle écrit une fois, appliqué partout.

3Exemples pratiques

Authentifier une fois pour toutes

Exemple
1const avecAuth = (route) => async (request) => {2  const qui = utilisateur(request);3  if (!qui) return Response.json({ erreur: "Authentification requise." }, { status: 401 });4  return route(request, qui);5};

La route protégée n'est même pas appelée sans utilisateur : l'oubli devient impossible.

Vérifier la propriété

Exemple
1const quete = quetes.get(id);2if (!quete) return introuvable();3if (quete.proprietaire !== qui.pseudo) {4  return Response.json({ erreur: "Accès refusé." }, { status: 403 });5}

Sans cette ligne, n'importe quel joueur connecté lirait les quêtes des autres en changeant l'identifiant de l'adresse — la faille la plus fréquente des API (IDOR).

4Erreurs courantes

Protéger par l'obscurité

À éviter

GET /admin-secret-2026/stats  // sans contrôle

À faire

avecAuth(avecRole("admin", stats))

Pourquoi : Une adresse se devine, se lit dans le code de l'application, s'énumère.

Un 401 trop bavard

À éviter

{ erreur: "Mot de passe incorrect pour codey" }

À faire

{ erreur: "Identifiants invalides." }

Pourquoi : La précision confirme l'existence du compte à celui qui cherche à deviner.

Oublier la propriété

À éviter

GET /quetes/:id → renvoie la quête à tout utilisateur connecté

À faire

vérifier que la quête appartient à l'utilisateur

Pourquoi : L'identifiant de l'adresse se modifie en une seconde.

5Subtilités à connaître

  • ◆Les jetons voyagent dans chaque requête : HTTPS est indispensable, sinon ils se lisent sur le réseau.
  • ◆CORS n'est pas une protection du serveur : c'est une règle du navigateur. Un script ou un outil en ligne de commande l'ignore.
  • ◆Une vraie limitation de débit compte par fenêtre de temps et partage son compteur entre serveurs, souvent dans Redis.

6Vérifie ta compréhension

Question 1/3

Score 0

Jeton valide, droits insuffisants :

Envie d'essayer ? Ouvre le Labo et recopie les exemples pour les modifier.