Dans ce tutoriel, nous allons mettre en place une protection OAuth2 pour une API REST Node.js grâce à Keycloak. Vous apprendrez à installer Keycloak en conteneur Docker, configurer un realm, un client et intégrer la librairie keycloak-connect dans une application Express. À la clé : une sécurisation robuste, centralisée et évolutive de vos microservices.

1. préparer l’environnement keycloak

Nous partons d’une machine avec Docker installé (détails sur Docker).

  1. Créer un docker network :
    docker network create keycloak-net
  2. Démarrer Keycloak en mode standalone :
    docker run -d --name keycloak \
      --network keycloak-net \
      -p 8080:8080 \
      -e KEYCLOAK_ADMIN=admin \
      -e KEYCLOAK_ADMIN_PASSWORD=admin \
      quay.io/keycloak/keycloak:22.0.1 \
      start-dev
  3. Accéder à la console : ouvrez http://localhost:8080 et connectez-vous en admin/admin.

1.1. créer un realm et un client

  1. Dans la console Keycloak, ajouter un nouveau Realm nommé novane-realm.
  2. Dans ce realm, créer un Client :
    • Client ID : api-server
    • Root URL : http://localhost:3000
    • Access Type : confidential (pour OAuth2)
    • Valid Redirect URIs : *
  3. Noter le Secret généré, nous en aurons besoin dans notre application Node.js.

2. développer l’api rest node.js

Nous allons créer un serveur Express simple (docs Node.js) et intégrer keycloak-connect.

npm init -y
npm install express keycloak-connect session-file-store

2.1. structure du code

.
├── index.js
└── keycloak.json

2.2. configuration keycloak.json

{
  "realm": "novane-realm",
  "auth-server-url": "http://localhost:8080",
  "ssl-required": "external",
  "resource": "api-server",
  "credentials": {
    "secret": "VOTRE_SECRET_ICI"
  },
  "confidential-port": 0
}

2.3. code du serveur (index.js)

const express = require('express');
const session = require('express-session');
const Keycloak = require('keycloak-connect');

const app = express();
const memoryStore = new session.MemoryStore();

app.use(session({
  secret: 'unSecretFort',
  resave: false,
  saveUninitialized: true,
  store: memoryStore
}));

const keycloak = new Keycloak({ store: memoryStore });

app.use(keycloak.middleware());

app.get('/public', (req, res) => {
  res.send('Accès public');
});

app.get('/protected', keycloak.protect(), (req, res) => {
  res.send('Ressource protégée pour ' + req.kauth.grant.access_token.content.preferred_username);
});

const PORT = 3000;
app.listen(PORT, () => {
  console.log(`API démarrée sur http://localhost:${PORT}`);
});

3. tester et obtenir un token

Utilisez curl pour récupérer un token OAuth2 et appeler l’endpoint protégé :

# Récupération du token
curl -X POST "http://localhost:8080/realms/novane-realm/protocol/openid-connect/token" \
  -d "client_id=api-server" \
  -d "grant_type=client_credentials" \
  -d "client_secret=VOTRE_SECRET_ICI"

# Supposons que vous recevez access_token=XYZ
curl -H "Authorization: Bearer XYZ" http://localhost:3000/protected
Erreur fréquente : « invalid_client » signifie souvent un mauvais secret ou un client non-confidential configuré en public. Vérifiez keycloak.json.

4. bonnes pratiques et métriques

  • Renouveler régulièrement les secrets (par ex. tous les 90 jours).
  • Activer la rotation des tokens dans Keycloak pour limiter l'impact d’un vol de token.
  • Mesurer le temps de réponse : selon OWASP 2026, la latence d’authentification doit rester <10 ms en moyenne.
  • Surveiller les logs Keycloak et Express pour détecter les 401 ou 403.

5. conclusion

Vous avez maintenant une API REST Node.js protégée par OAuth2 via Keycloak, facile à maintenir et à faire évoluer. Pour aller plus loin, explorez l’intégration d’un Identity Broker ou la gestion des rôles dynamiques.

Envie d’un accompagnement sur-mesure pour vos projets SaaS ou ERP/CRM ? Découvrez nos services d’intégration IA et développement d’applications web.

Besoin de conseil ? Contactez-nous pour une séance offerte.