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. Assurez-vous que la facturation est activée pour votre projet Cloud. Découvrez comment vérifier que la facturation est activée pour votre projet.

  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. Assurez-vous que la facturation est activée pour votre projet Cloud. Découvrez comment vérifier que la facturation est activée pour votre projet.

  6. Activez Identity Platform et ajoutez le SDK client à votre application. Pour savoir comment procéder, consultez le Guide de démarrage rapide.

Configurer le fournisseur

  1. Accédez à la page Fournisseurs d'identité dans Cloud Console.
    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.

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

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. Cloud Console et l'outil de ligne de commande gcloud ne sont pas compatibles.

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

    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.

    Pour afficher une fenêtre pop-up, appelez signInWithPopup() :

    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 error.
      });
    

    Redirection

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

    firebase.auth().signInWithRedirect(provider);
    

    Appelez ensuite getRedirectResult() pour obtenir les résultats lorsque l'utilisateur revient à votre application :

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

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 méthode différente (adresse e-mail/mot de passe, par exemple), vous pouvez associer son compte existant au fournisseur SAML avec linkWithPopup() ou linkWithRedirect(). Exemple :

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

// Link with a popup.
firebase.auth().currentUser.linkWithPopup(provider)
    // currentUser.providerData now has an additional entry for this provider.
  }).catch((error) => {
    // Handle error.
  });

Réauthentifier des utilisateurs

Certaines opérations sensibles, telles que la mise à jour de l'adresse e-mail ou du mot de passe d'un utilisateur, nécessitent que l'utilisateur se soit récemment connecté. Pour reconnecter un utilisateur, appelez la méthode reauthenticateWithPopup() ou reauthenticateWithRedirect(). Exemple :

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

// Reauthenticate with a popup.
firebase.auth().currentUser.reauthenticateWithPopup(provider)
  .then((result) => {
    // Get the updated ID token.
    return result.user.getIdTokenResult();
  })
  .then((idTokenResult) => {
    // idTokenResult.authTime should be updated to reflect recent sign-in status.
    // idTokenResult.token has the latest ID token.
  })
  .catch((error) => {
    // Handle error.
  });

Étape suivante