es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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.

Tags:  , , , ,

Answer

  1. Avatar for 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étodo strategy.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:

    app.get('/logout', function(req, res, next) {
      // Llama al método de cierre de sesión de la estrategia SAML
      req.logout();
      req.user = null; // Asegúrate de que req.user sea nulo antes de redirigir de vuelta al IDP
      strategy.logout(req, function(err, url) {
        if (err) {
          return next(err);
        }
        // Redirige al usuario a la URL de cierre de sesión SAML
        res.redirect(url);
      });
    });
    

    En este código, primero llamamos a req.logout() para cerrar la sesión del usuario localmente. Luego llamamos al método strategy.logout() con el objeto req 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 que req.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!

Comments are closed.