Permitir que los usuarios accedan con SAML

En este documento, se muestra cómo usar Identity Platform para que los usuarios accedan con un proveedor del lenguaje de marcado para confirmaciones de seguridad (SAML) 2.0.

Antes de comenzar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Habilita Identity Platform y agrega el SDK de cliente a tu app. Consulta la Guía de inicio rápido para aprender a hacerlo.

Configura el proveedor

  1. Ve a la página Proveedores de identidad en la consola de Google Cloud.
    Ir a la página de proveedores de identidad

  2. Haz clic en Agregar un proveedor y selecciona SAML de la lista.

  3. Ingresa los siguientes detalles:

    1. El Nombre del proveedor. Puede ser el mismo que el ID del proveedor o un nombre personalizado. Si ingresas un nombre personalizado, haz clic en Editar junto a ID del proveedor para especificar el ID (que debe comenzar con saml.).

    2. El ID de la entidad del proveedor.

    3. La URL de SSO de SAML del proveedor.

    4. El certificado que se usa para la firma de tokens en el proveedor. Asegúrate de incluir las strings de inicio y fin. Por ejemplo:

      -----BEGIN CERTIFICATE-----
      MIICajCCAdOgAwIBAgIBADANBgkqhkiG9w0BAQ0FADBSMQswCQYDVQQGEwJ1czEL
      ...
      LEzc1JwEGQQVDYQCwsQMSBDAF0QAB0w9GikhqkgBNADABIgABIwAgOdACCjaCIIM
      -----END CERTIFICATE-----
      
  4. En Proveedor de servicios, ingresa el ID de entidad de tu app. Por lo general, es la URL de tu app. En tu proveedor de identidad SAML, se hace referencia a esto como el público.

  5. Agrega tu app a la lista de Dominios autorizados. Por ejemplo, si la URL de acceso de tu app es https://example.com/login, agrega example.com.

  6. Si es necesario, personaliza la URL de devolución de llamada de la app. Normalmente, los proveedores de identidad de SAML suelen llamarla URL del servicio de confirmación de consumidores (ACS).

    Usar la URL de devolución de llamada predeterminada reduce la complejidad de validar la respuesta de SAML. Si personalizas este flujo, asegúrate de que la URL de devolución de llamada de Identity Platform para tu proyecto esté configurada en tu proveedor de identidad de SAML. Por lo general, se parece a https://[PROJECT-ID].firebaseapp.com/__/auth/handler. Consulta Personaliza un controlador de autenticación para obtener más información.

  7. Haz clic en Guardar.

Elementos obligatorios del proveedor

Identity Platform espera los elementos <saml:Subject> y <saml:NameID> en las respuestas del proveedor. Si no defines valores para estos elementos cuando configures tu proveedor, la aserción de SAML fallará.

Solicitudes de firmas

Para aumentar la seguridad de tus solicitudes de autenticación, debes firmarlas.

Para firmar solicitudes, primero habilita las solicitudes firmadas de tu proveedor de identidad. Para ello, llama a inboundSamlConfigs.patch() y establece idp_config.sign_request en true:

REST

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • project-id: El ID del proyecto de Google Cloud
  • provider-id: el ID del proveedor de SAML

Método HTTP y URL:

PATCH https://identitytoolkit.googleapis.com/admin/v2/projects/project-id/inboundSamlConfigs/provider-id?updateMask=idpConfig.signRequest

Cuerpo JSON de la solicitud:

{
  "idp_config": {
    "sign_request": true
  }
}

Para enviar tu solicitud, expande una de estas opciones:

 

Debes usar la API de REST para habilitar las solicitudes firmadas. No se admite el uso de la consola de Google Cloud ni Google Cloud CLI.

La respuesta es un objeto InboundSamlConfig, que incluye un array de SpCertificate. Configura el valor del certificado X509 con tu proveedor de identidad SAML para que pueda validar la firma de tus solicitudes.

Usuarios que acceden

Cuando un usuario accede, el SDK de cliente controla el protocolo de enlace de la autenticación y, luego, muestra los tokens de ID que contienen los atributos de SAML en sus cargas útiles. Para que un usuario acceda y obtenga atributos del proveedor de SAML, haz lo siguiente:

  1. Crea una instancia SAMLAuthProvider con el ID del proveedor que configuraste en la sección anterior. El ID del proveedor debe comenzar con saml..

    Web versión 9

    import { SAMLAuthProvider } from "firebase/auth";
    
    const provider = new SAMLAuthProvider("saml.myProvider");

    Web versión 8

    const provider = new firebase.auth.SAMLAuthProvider('saml.myProvider');
  2. Inicia el flujo de acceso. Puedes elegir usar una ventana emergente o un redireccionamiento.

    Web versión 9

    import { getAuth, signInWithPopup, SAMLAuthProvider } from "firebase/auth";
    
    const auth = getAuth();
    signInWithPopup(auth, provider)
      .then((result) => {
        // User is signed in.
        // Provider data available from the result.user.getIdToken()
        // or from result.user.providerData
      }).catch((error) => {
        // Handle Errors here.
        const errorCode = error.code;
        const errorMessage = error.message;
        // The email of the user's account used.
        const email = error.customData.email;
        // The AuthCredential type that was used.
        const credential = SAMLAuthProvider.credentialFromError(error);
        // Handle / display error.
        // ...
      });

    Web versión 8

    firebase.auth().signInWithPopup(provider)
      .then((result) => {
        // User is signed in.
        // Identity provider data available in result.additionalUserInfo.profile,
        // or from the user's ID token obtained from result.user.getIdToken()
        // as an object in the firebase.sign_in_attributes custom claim
        // This is also available from result.user.getIdTokenResult()
        // idTokenResult.claims.firebase.sign_in_attributes.
      })
      .catch((error) => {
        // Handle / display error.
        // ...
      });

    Redireccionamiento

    Para redireccionar a una página de acceso, llama a signInWithRedirect():

    Web versión 9

    import { getAuth, signInWithRedirect } from "firebase/auth";
    
    const auth = getAuth();
    signInWithRedirect(auth, provider);

    Web versión 8

    firebase.auth().signInWithRedirect(provider);

    Luego, llama a getRedirectResult() para obtener los resultados cuando el usuario regrese a tu app:

    Web versión 9

    import { getAuth, getRedirectResult, SAMLAuthProvider } from "firebase/auth";
    
    const auth = getAuth();
    getRedirectResult(auth)
      .then((result) => {
        // User is signed in.
        // Provider data available from the result.user.getIdToken()
        // or from result.user.providerData
      })
      .catch((error) => {
        // Handle Errors here.
        const errorCode = error.code;
        const errorMessage = error.message;
        // The email of the user's account used.
        const email = error.customData.email;
        // The AuthCredential type that was used.
        const credential = SAMLAuthProvider.credentialFromError(error);
        // Handle / display error.
        // ...
      });

    Web versión 8

    firebase.auth().getRedirectResult()
      .then((result) => {
        // User is signed in.
        // Provider data available in result.additionalUserInfo.profile,
        // or from the user's ID token obtained from result.user.getIdToken()
        // as an object in the firebase.sign_in_attributes custom claim
        // This is also available from result.user.getIdTokenResult()
        // idTokenResult.claims.firebase.sign_in_attributes.
      }).catch((error) => {
        // Handle / display error.
        // ...
      });
  3. Recupera los atributos de usuario asociados con el proveedor de SAML del token de ID mediante la reclamación firebase.sign_in_attributes. Asegúrate de verificar el token de ID con el SDK de Admin cuando lo envíes a tu servidor.

    El token de ID incluye la dirección de correo electrónico del usuario solo si se proporciona en el atributo NameID de la aserción de SAML del proveedor de identidad:

    <Subject>
      <NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">test@email.com</NameID>
    </Subject>
    

    Se propaga en el token de ID emitido por Firebase y en el objeto UserInfo.

Actualmente, solo se admiten los flujos de SAML iniciados por el proveedor de servicios del SDK del cliente.

Vincula cuentas de usuario

Si un usuario ya accedió a tu app con un método diferente (como correo electrónico o contraseña), puedes vincular su cuenta existente al proveedor de SAML con linkWithPopup() o linkWithRedirect(): Por ejemplo, podemos vincular con una Cuenta de Google:

Web versión 9

import { getAuth, linkWithPopup, GoogleAuthProvider } from "firebase/auth";
const provider = new GoogleAuthProvider();

const auth = getAuth();
linkWithPopup(auth.currentUser, provider).then((result) => {
  // Accounts successfully linked.
  const credential = GoogleAuthProvider.credentialFromResult(result);
  const user = result.user;
  // ...
}).catch((error) => {
  // Handle Errors here.
  // ...
});

Web versión 8

auth.currentUser.linkWithPopup(provider).then((result) => {
  // Accounts successfully linked.
  var credential = result.credential;
  var user = result.user;
  // ...
}).catch((error) => {
  // Handle Errors here.
  // ...
});

¿Qué sigue?