implémenter l’authentification OAuth2 Keycloak dans une API Node.js Express

Dans ce tutoriel, nous allons sécuriser une API REST Node.js (Express) en déployant Keycloak via Docker et en configurant OAuth2. À l’issue de ce guide, votre startup ou PME disposera d’un système d’authentification robuste, extensible et conforme aux bonnes pratiques de sécurité.

prérequis

  • Node.js ≥14 et Express.js
  • Docker ≥20 (voir Docker)
  • Client HTTP (Postman, cURL)
  • Clé API Keycloak ou accès admin

1. déploiement de Keycloak en conteneur Docker

  1. Créer un fichier docker-compose.yml :
version: '3.8'
services:
  keycloak:
    image: quay.io/keycloak/keycloak:21.1.1
    environment:
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: AdminPass123
    command: start-dev
    ports:
      - "8080:8080"

Commandes pour lancer :

docker-compose up -d
docker logs -f   # vérifier le démarrage en ~15s

configuration du realm et client OAuth2

  1. Se connecter à l’interface admin : http://localhost:8080 (admin/AdminPass123).
  2. Créer un realm (ex. my-app).
  3. Ajouter un client
    • Client ID : node-api
    • Accès public : désactivé
    • Credentials : noter le secret
    • Valid Redirect URIs : http://localhost:3000/*

2. intégration dans votre API Node.js

Installer la dépendance keycloak-connect :

npm install keycloak-connect express-session

Exemple minimal :

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

const app = express();
app.use(session({ secret: 'session-secret', resave: false, saveUninitialized: true }));

const keycloak = new Keycloak({ store: new session.MemoryStore() }, {
  clientId: 'node-api',
  bearerOnly: true,
  serverUrl: 'http://localhost:8080',
  realm: 'my-app',
  credentials: { secret: 'VOTRE_SECRET_ICI' }
});

app.use(keycloak.middleware());

app.get('/api/public', (req, res) => {
  res.json({ msg: 'accès public' });
});

app.get('/api/private', keycloak.protect(), (req, res) => {
  res.json({ msg: 'accès restreint, utilisateur ' + req.kauth.grant.access_token.content.preferred_username });
});

app.listen(3000, () => console.log('API démarrée sur port 3000'));

test de l’authentification

  1. Récupérer un access token via cURL :
curl -X POST 'http://localhost:8080/realms/my-app/protocol/openid-connect/token' \
 -d 'grant_type=password&client_id=node-api' \
 -d 'username=admin&password=AdminPass123' \
 -d 'client_secret=VOTRE_SECRET_ICI'

Ensuite, appeler l’endpoint protégé :

curl http://localhost:3000/api/private \
 -H 'Authorization: Bearer VOTRE_ACCESS_TOKEN'

3. bonnes pratiques sécurité et perf

  • Limiter le CORS au domaine de votre front-end.
  • Renouveler les secrets tous les 90 jours (automatiser via cron ou Vault).
  • Activer HTTPS en frontal (Nginx, service d’application web Novane).
  • Mesurer le temps de validation du token : viser <50 ms (profilage Node.js).
  • Surveiller les erreurs avec un outil APM (Sentry, Datadog).

conclusion

En quelques étapes, vous avez mis en place une authentification OAuth2 Keycloak pour votre API Node.js Express, garantissant sécurité, évolutivité et conformité. Cette solution s’intègre facilement dans une architecture microservices ou monolithe et s’adapte à vos besoins en termes de gestion des utilisateurs.

Pour aller plus loin ou intégrer cette configuration dans un projet existant, contactez nos experts ou découvrez nos réalisations Node.js.

Besoin d’un accompagnement complet ? N’hésitez pas à demander un devis.