psasport-azure-ad es un conjunto de estrategias de Passport.js que permite integrar Azure Active Directory en aplicaciones Node.js. Ofrece soporte para OpenID Connect, WS-Federation y SAML-P, facilitando la implementación de inicio de sesión único y protección de endpoints.
Preparación del entorno
Crea un proyecto Node.js e instala los paquetes necesarios:
mkdir autenticacion-azure && cd autenticacion-azure
npm init -y
npm install express passport express-session passport-azure-ad
Configuración de la estrategia OpenID Connect
Los parámetros de conexión se obtienen desde el registro de la aplicación en el portal de Azure. El siguiente bloque define la configuración y el callback de verificación:
const passport = require('passport');
const OIDCStrategy = require('passport-azure-ad').OIDCStrategy;
const configuracionOIDC = {
identityMetadata: 'https://login.microsoftonline.com/TU_TENANT_ID/v2.0/.well-known/openid-configuration',
clientID: 'TU_CLIENT_ID',
responseType: 'code',
responseMode: 'query',
redirectUrl: 'https://tudominio.com/auth/retorno',
clientSecret: 'TU_SECRETO',
validateIssuer: true,
issuer: 'https://login.microsoftonline.com/TU_TENANT_ID/v2.0',
scope: ['profile', 'email'],
loggingLevel: 'info',
nonceLifetime: 3600,
useCookieInsteadOfSession: false,
cookieSameSite: 'Lax',
clockSkew: 300
};
passport.use(new OIDCStrategy(configuracionOIDC, (iss, sub, profile, done) => {
// Lógica para encontrar o registrar al usuario en el sistema
return done(null, profile);
}));
passport.serializeUser((usuario, done) => done(null, usuario));
passport.deserializeUser((usuario, done) => done(null, usuario));
Definición de rutas de autenticación
Conecta el middleware de Passport y define las rutas que desancadenan el flujo de login y procesan la respuesta de Azure AD:
const express = require('express');
const app = express();
app.use(require('express-session')({ secret: 'cadena-secreta', resave: false, saveUninitialized: false }));
app.use(passport.initialize());
app.use(passport.session());
// Inicia el proceso de autenticación
app.get('/login', passport.authenticate('azuread-openidconnect', { failureRedirect: '/' }));
// Callback donde Azure AD redirige después de autenticar
app.post('/auth/retorno',
passport.authenticate('azuread-openidconnect', { failureRedirect: '/' }),
(req, res) => {
res.redirect('/area-privada');
}
);
// Ruta protegida de ejemplo
app.get('/area-privada', (req, res) => {
if (!req.isAuthenticated()) return res.redirect('/login');
res.send(`<h1>Hola ${req.user.displayName}</h1>`);
});
Recomendaciones importantes
En producción, habilita siempre validateIssuer y utiliza HTTPS. Las claves de cifrado de cookies deben almacenarse de forma segura y, si se opta por setiones en lugar de cookies, conviene emplear un almacén como Redis. Para escenarios complejos, el ecosistema Azure también dispone de @azure/msal-node, aunque passport-azure-ad sigue siendo una alternativa madura y estable para aplicaciones Express.