Skip to content
Learni
View all tutorials
Sécurité & Identité

Comment sécuriser une API avec Microsoft Entra ID en 2026

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

terminal
az login
az ad app create --display-name "MonAPI-Production" --sign-in-audience "AzureADMyOrg" --is-fallback-public-client false

Cette 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

app-manifest.json
{
  "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

src/auth/msalConfig.ts
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

src/middleware/auth.ts
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

src/server.ts
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.

Comment sécuriser une API avec Microsoft Entra ID en 2026 | Learni