Introduction
Microsoft Entra ID (ex-Azure Active Directory) est la solution d'identité cloud de Microsoft. En 2026, les entreprises exigent une authentification centralisée, des tokens courts, du Conditional Access et une gestion fine des permissions. Ce tutoriel vous guide pas à pas pour sécuriser une API Node.js/TypeScript avec Entra ID. Vous apprendrez à enregistrer une application, configurer des scopes, émettre des tokens JWT et les valider côté serveur. Chaque étape inclut du code prêt à l'emploi et des explications concrètes pour éviter les erreurs de configuration courantes en production.
Prérequis
- Compte Azure avec permissions Global Administrator ou Application Administrator
- Node.js 20+ et TypeScript 5.4+
- Connaissances solides en JWT et OAuth 2.0
- Azure CLI installé (version 2.60+)
Créer l'application dans Entra ID
az login
az ad app create --display-name "MonAPI-Production" --sign-in-audience "AzureADMyOrg" --is-fallback-public-client falseCette commande crée l'application Entra ID. Notez l'AppId et l'ObjectId retournés. Utilisez toujours AzureADMyOrg pour les environnements d'entreprise et évitez les applications multi-tenant non contrôlées.
Définir les scopes et permissions
{
"id": "00000000-0000-0000-0000-000000000000",
"appId": "votre-app-id",
"displayName": "MonAPI-Production",
"api": {
"requestedAccessTokenVersion": 2,
"oauth2PermissionScopes": [
{
"adminConsentDisplayName": "Accès complet à l'API",
"adminConsentDescription": "Permet à l'application d'accéder à toutes les fonctionnalités de l'API",
"userConsentDisplayName": "Accès à l'API",
"userConsentDescription": "Permet à l'application d'accéder à vos données via l'API",
"value": "access_as_user",
"type": "User",
"id": "11111111-1111-1111-1111-111111111111"
}
]
}
}Ce manifest JSON configure le scope 'access_as_user'. Importez-le via az ad app update --id votre-app-id --app-manifest. Les versions de token 2 sont obligatoires pour supporter les claims modernes.
Configuration MSAL côté client
import { Configuration } from '@azure/msal-browser';
export const msalConfig: Configuration = {
auth: {
clientId: 'votre-app-id',
authority: 'https://login.microsoftonline.com/votre-tenant-id',
redirectUri: 'http://localhost:3000/auth/callback'
},
cache: { cacheLocation: 'sessionStorage', storeAuthStateInCookie: false }
};Cette configuration MSAL utilise l'autorité spécifique au tenant. Remplacez les IDs par vos valeurs réelles. Le cache sessionStorage limite la persistance des tokens.
Validation du token JWT côté serveur
import { jwtVerify } from 'jose';
import { createRemoteJWKSet } from 'jose';
const JWKS = createRemoteJWKSet(new URL('https://login.microsoftonline.com/votre-tenant-id/discovery/v2.0/keys'));
export async function validateToken(token: string) {
const { payload } = await jwtVerify(token, JWKS, {
issuer: 'https://login.microsoftonline.com/votre-tenant-id/v2.0',
audience: 'api://votre-app-id'
});
if (!payload.scp?.includes('access_as_user')) throw new Error('Scope insuffisant');
return payload;
}Validation stricte avec JWKS dynamique. Vérifiez toujours l'audience, l'émetteur et le scope personnalisé. Cette méthode rejette les tokens émis pour d'autres applications.
Middleware Express complet
import express from 'express';
import { validateToken } from './middleware/auth';
const app = express();
app.use(express.json());
app.use(async (req, res, next) => {
const authHeader = req.headers.authorization;
if (!authHeader?.startsWith('Bearer ')) return res.status(401).send('Token manquant');
try {
req.user = await validateToken(authHeader.split(' ')[1]);
next();
} catch (e) {
res.status(401).send('Token invalide');
}
});
app.get('/api/protected', (req, res) => res.json({ message: 'Accès autorisé', user: req.user }));
app.listen(4000);Middleware Express qui protège toutes les routes. Les erreurs de validation renvoient 401 sans détails pour éviter les fuites d'information.
Bonnes pratiques
- Toujours utiliser des tokens version 2 et des scopes spécifiques plutôt que des rôles larges
- Activer Conditional Access avec MFA et localisation pour les applications critiques
- Stocker les secrets dans Azure Key Vault et non dans le code
- Implémenter la rotation automatique des clés via Entra ID
- Logger uniquement les claims nécessaires pour le debugging
Erreurs courantes à éviter
- Oublier de définir l'audience exacte dans la validation JWT
- Utiliser des tokens v1 au lieu de v2 avec les scopes personnalisés
- Ne pas configurer les redirect URIs en HTTPS en production
- Ignorer la révocation des tokens lors de la déconnexion
Pour aller plus loin
Découvrez nos formations avancées sur la gouvernance des identités et l'intégration Entra ID avec des architectures Zero Trust sur Learni Group.