Autenticación con Azure AD en Node.js usando passport-azure-ad

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.

Etiquetas: Node.js passport-azure-ad azure-active-directory openid-connect autenticación

Publicado el 9-19 06:42