¿Cómo puedo implementar el Cierre de Sesión Único (Single Logout) utilizando Passport.js en un middleware de node / express?
Estoy implementando SAML SSO utilizando Passport y passport-saml en un middleware de node/express.
Tengo definidos los siguientes usuarios y estrategias de express:
Usuario
const savedUsers = [];
passport.serializeUser((expressUser, done) => {
done(null, expressUser);
});
passport.deserializeUser((expressUser, done) => {
done(null, expressUser);
});
Estrategia
const strategy = new Strategy(
{
entryPoint: process.env.SSO_ENTRYPOINT,
issuer: process.env.SSO_ISSUER,
protocol: process.env.SSO_PROTOCOL,
logoutUrl: process.env.SSO_LOGOUT_URL,
cert: fs.readFileSync('./.cert/saml-cert.pem', 'utf-8'),
path: 'sso/callback'
},
(expressUser, done) => {
if (!savedUsers.includes(expressUser)) {
savedUsers.push(expressUser);
}
return done(null, expressUser);
}
);
El SSO funciona bien. Lo que no puedo entender es cómo hacer que el SLO funcione. He visto algunos ejemplos en SO como los siguientes:
strategy.logout(req, function(err, requestUrl) {
// Cierre de sesión local
req.logout();
// Redireccionar al proveedor de identidad con la solicitud de cierre de sesión SAML cifrada
res.redirect(requestUrl);
});
Pero esto no funciona, en parte porque no sé qué debería ser la requestUrl
y en segunda instancia cómo se utiliza la logoutUrl
de Passport y si necesito proporcionar datos adicionales. La logoutUrl
es la URL del servicio de cierre de sesión único proporcionada por el proveedor de servicios de identidad (en mi caso, PingIdentity).
La documentación en el sitio web de Passport es escasa.
Cualquier ayuda será muy apreciada.
davy.ai
Para implementar SLO (Single Logout) con Passport y passport-saml, es necesario llamar al método
strategy.logout()
y proporcionar una función de devolución de llamada que recibirá un error y una URL de redireccionamiento. El métodostrategy.logout()
generará una solicitud de cierre de sesión SAML y la firmará con la clave privada proporcionada en la configuración SAML. La URL de redireccionamiento es hacia donde debes redirigir al usuario después de cerrar su sesión localmente.Aquí tienes un ejemplo de implementación:
En este código, primero llamamos a
req.logout()
para cerrar la sesión del usuario localmente. Luego llamamos al métodostrategy.logout()
con el objetoreq
y una función de devolución de llamada que recibirá un error (si lo hay) y una URL de redireccionamiento. Finalmente, redirigimos al usuario a la URL de cierre de sesión SAML. Ten en cuenta quereq.user
debe establecerse como nulo para inicializar una correcta cierre de sesión SAML.La propiedad
logoutUrl
en la configuración SAML debe establecerse como la URL del servicio de cierre de sesión único proporcionada por el Proveedor de Identidad (IDP). Passport-SAML manejará automáticamente la comunicación con el IDP para cerrar la sesión del usuario en todas las aplicaciones en las que estén actualmente conectados. En la mayoría de los casos, no es necesario proporcionar datos adicionales.¡Espero que esto sea de ayuda!