Procéder à la connexion des utilisateurs avec SAML

Ce document explique comment utiliser Identity Platform pour connecter des utilisateurs avec un fournisseur SAML (Security Assertion Markup Language) 2.0.

Avant de commencer

  1. Connectez-vous à votre compte Google Cloud. Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits gratuits pour exécuter, tester et déployer des charges de travail.
  2. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  3. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  4. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  5. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  6. Activez Identity Platform et ajoutez le SDK client à votre application. Pour en savoir plus, consultez le guide de démarrage rapide.

Configurer le fournisseur

  1. Accédez à la page Fournisseurs d'identité dans la console Google Cloud.
    Accéder à la page "Fournisseurs d'identité"

  2. Cliquez sur Ajouter un fournisseur, puis sélectionnez SAML dans la liste.

  3. Saisissez les informations suivantes :

    1. Le nom du fournisseur. Il peut s'agir de l'ID du fournisseur ou d'un nom personnalisé. Si vous saisissez un nom personnalisé, cliquez sur Modifier à côté de ID de fournisseur pour spécifier l'ID (qui doit commencer par saml.).

    2. ID d'entité du fournisseur.

    3. L'URL SSO SAML du fournisseur

    4. Certificat utilisé pour la signature des jetons sur le fournisseur. Veillez à inclure les chaînes de début et de fin. Exemple :

      -----BEGIN CERTIFICATE-----
      MIICajCCAdOgAwIBAgIBADANBgkqhkiG9w0BAQ0FADBSMQswCQYDVQQGEwJ1czEL
      ...
      LEzc1JwEGQQVDYQCwsQMSBDAF0QAB0w9GikhqkgBNADABIgABIwAgOdACCjaCIIM
      -----END CERTIFICATE-----
      
  4. Sous Fournisseur de services, saisissez l'ID d'entité de votre application. Il s'agit généralement de l'URL de votre application. Sur votre fournisseur d'identité SAML, il s'agit de l'audience.

  5. Ajoutez votre application à la liste des Domaines autorisés. Par exemple, si l'URL de connexion de votre application est https://example.com/login, ajoutez example.com.

  6. Si nécessaire, personnalisez l'URL de rappel de votre application. Les fournisseurs d'identité SAML le nomment généralement l'URL du service ACS (Assertion Consumer Service).

    L'utilisation de l'URL de rappel par défaut réduit la complexité de la validation de la réponse SAML. Si vous personnalisez ce flux, assurez-vous que l'URL de rappel d'Identity Platform pour votre projet est configurée sur votre fournisseur d'identité SAML. Elle se présente généralement sous la forme https://[PROJECT-ID].firebaseapp.com/__/auth/handler. Pour en savoir plus, consultez la section Personnaliser un gestionnaire d'authentification.

  7. Cliquez sur Enregistrer.

Éléments requis par le fournisseur

Identity Platform attend les éléments <saml:Subject> et <saml:NameID> dans les réponses du fournisseur. Si vous ne définissez pas de valeurs pour ces éléments lors de la configuration de votre fournisseur, l'assertion SAML échoue.

Signer les requêtes

Vous pouvez renforcer la sécurité de vos requêtes d'authentification en les signant.

Pour signer des requêtes, commencez par activer les requêtes signées pour votre fournisseur d'identité en appelant inboundSamlConfigs.patch() et en définissant idp_config.sign_request sur true :

REST

Avant d'utiliser les données de requête, effectuez les remplacements suivants:

  • project-id: ID du projet Google Cloud
  • provider-id: ID du fournisseur SAML

Méthode HTTP et URL :

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

Corps JSON de la requête :

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

Pour envoyer votre requête, développez l'une des options suivantes :

 

Vous devez utiliser l'API REST pour activer les requêtes signées. Il n'est pas possible d'utiliser la console Google Cloud ni Google Cloud CLI.

La réponse est un objet InboundSamlConfig, qui comprend un tableau de SpCertificate. Configurez la valeur du certificat X509 avec votre fournisseur d'identité SAML afin qu'il puisse valider la signature de vos requêtes.

Procéder à la connexion des utilisateurs

Lorsque vous connectez un utilisateur, le SDK client gère le handshake d'authentification, puis renvoie des jetons d'ID contenant les attributs SAML dans leurs charges utiles. Pour connecter un utilisateur et obtenir les attributs du fournisseur SAML, procédez comme suit :

  1. Créez une instance SAMLAuthProvider avec l'ID de fournisseur que vous avez configuré à la section précédente. L'ID du fournisseur doit commencer par saml..

    Version Web 9

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

    Version Web 8

    const provider = new firebase.auth.SAMLAuthProvider('saml.myProvider');
  2. Démarrez le flux de connexion. Vous pouvez choisir d'utiliser un pop-up ou une redirection.

    Version Web 9

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

    Version Web 8

    const provider = new firebase.auth.SAMLAuthProvider('saml.myProvider');

    Redirection

    Pour rediriger vers une page de connexion, appelez signInWithRedirect():

    Version Web 9

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

    Version Web 8

    firebase.auth().signInWithRedirect(provider);

    Ensuite, appelez getRedirectResult() pour obtenir les résultats lorsque l'utilisateur revient dans votre application:

    Version Web 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.
        // ...
      });

    Version Web 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. Récupérez les attributs utilisateur associés au fournisseur SAML à partir du jeton d'ID en utilisant la revendication firebase.sign_in_attributes. Veillez à valider le jeton d'ID à l'aide du SDK Admin lorsque vous envoyez ce jeton à votre serveur.

    Le jeton d'ID n'inclut l'adresse e-mail de l'utilisateur que si elle est fournie dans l'attribut NameID de l'assertion SAML du fournisseur d'identité:

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

    Ce champ est renseigné dans le jeton d'identification fourni par Firebase et dans l'objet UserInfo.

Actuellement, seuls les flux SAML initiés par le fournisseur de services à partir du SDK client sont compatibles.

Associer des comptes utilisateur

Si un utilisateur s'est déjà connecté à votre application à l'aide d'une autre méthode (par exemple, adresse e-mail/mot de passe), vous pouvez associer son compte existant au fournisseur SAML à l'aide de linkWithPopup() ou linkWithRedirect(). Par exemple, nous pouvons associer son compte à un compte Google :

Version Web 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.
  // ...
});

Version Web 8

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

Étapes suivantes