sécuriser une api rest node.js avec oauth2 et keycloak : guide complet
30/01/2026
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).
- Créer un docker network :
docker network create keycloak-net - 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 - Accéder à la console : ouvrez http://localhost:8080 et connectez-vous en
admin/admin.
1.1. créer un realm et un client
- Dans la console Keycloak, ajouter un nouveau Realm nommé
novane-realm. - Dans ce realm, créer un Client :
- Client ID :
api-server - Root URL :
http://localhost:3000 - Access Type : confidential (pour OAuth2)
- Valid Redirect URIs :
*
- Client ID :
- 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 2025, 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.

