Accesso degli utenti con SAML

Questo documento mostra come utilizzare Identity Platform per eseguire l'accesso degli utenti con un Provider SAML (Security Assertion Markup Language) 2.0.

Prima di iniziare

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

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

    Go to project selector

  5. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  6. Abilita Identity Platform e aggiungi l'SDK del client alla tua app. Consulta le Guida rapida per scopri come.

Configurazione del provider

  1. Vai alla pagina Provider di identità nella console Google Cloud.
    Vai alla pagina Provider di identità

  2. Fai clic su Add a Provider (Aggiungi un provider) e seleziona SAML dall'elenco.

  3. Inserisci i seguenti dettagli:

    1. Il nome del fornitore. Può essere uguale all'ID provider, o un nome personalizzato. Se inserisci un nome personalizzato, fai clic su Modifica accanto a ID provider per specificare l'ID (che deve iniziare con saml.).

    2. L'ID entità del provider.

    3. L'URL SSO SAML del provider.

    4. Il certificato utilizzato per la firma del token sul provider. Assicurati di che includono le stringhe di inizio e fine. Ad esempio:

      -----BEGIN CERTIFICATE-----
      MIICajCCAdOgAwIBAgIBADANBgkqhkiG9w0BAQ0FADBSMQswCQYDVQQGEwJ1czEL
      ...
      LEzc1JwEGQQVDYQCwsQMSBDAF0QAB0w9GikhqkgBNADABIgABIwAgOdACCjaCIIM
      -----END CERTIFICATE-----
      
  4. In Fornitore di servizi, inserisci l'ID entità dell'app. Questo è di solito l'URL dell'app. Nel tuo provider di identità SAML, noto come segmento di pubblico.

  5. Aggiungi la tua app all'elenco dei domini autorizzati. Ad esempio, se l'URL di accesso dell'app è https://example.com/login, aggiungi example.com.

  6. Se necessario, personalizza l'URL di callback per la tua app. Questo è comunemente chiamato URL ACS (Assertion Consumer Service) da SAML e i provider di identità.

    L'utilizzo dell'URL di callback predefinito riduce la complessità della convalida del protocollo SAML risposta. Se personalizzi questo flusso, assicurati che Identity Platform l'URL di callback per il progetto sia configurato nel tuo provider di identità SAML. Di solito ha il seguente aspetto: https://[PROJECT-ID].firebaseapp.com/__/auth/handler. Consulta Personalizzazione di un gestore autenticazione per saperne di più.

  7. Fai clic su Salva.

Elementi obbligatori del fornitore

Identity Platform prevede che le risposte del provider siano gli elementi <saml:Subject> e <saml:NameID>. Se non definisci i valori per questi elementi durante la configurazione del provider, l'asserzione SAML non riuscirà.

Richieste di firma

Puoi aumentare la sicurezza delle tue richieste di autenticazione firmandole.

Per firmare le richieste, abilita prima le richieste firmate per il tuo provider di identità chiamata al numero inboundSamlConfigs.patch(), e l'impostazione di idp_config.sign_request su true:

REST

Prima di utilizzare i dati della richiesta, effettua le seguenti sostituzioni:

  • project-id: l'ID del progetto Google Cloud
  • provider-id: l'ID del provider SAML

Metodo HTTP e URL:

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

Corpo JSON della richiesta:

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

Per inviare la richiesta, espandi una delle seguenti opzioni:

 

Devi utilizzare l'API REST per abilitare le richieste firmate. utilizzando La console Google Cloud o Google Cloud CLI non è supportata.

La risposta è InboundSamlConfig che include un array di SpCertificate. Configura il valore del certificato X509 con il tuo provider di identità SAML può convalidare la firma delle tue richieste.

Accesso degli utenti

Quando esegui l'accesso di un utente, l'SDK del client gestisce l'autenticazione handshake, restituisce i token ID contenenti gli attributi SAML e carichi di lavoro superflui. Per eseguire l'accesso di un utente e ricevere attributi dal provider SAML:

  1. Crea una SAMLAuthProvider con l'ID provider che hai configurato nella sezione precedente. L'ID provider deve iniziare con saml..

    Versione web 9

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

    Versione web 8

    const provider = new firebase.auth.SAMLAuthProvider('saml.myProvider');
  2. Avvia il flusso di accesso. Puoi scegliere di usare un popup o un reindirizzamento.

    Versione web 9

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

    Versione web 8

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

    Reindirizzamento

    Per reindirizzare gli utenti a una pagina di accesso, chiama signInWithRedirect():

    Versione web 9

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

    Versione web 8

    firebase.auth().signInWithRedirect(provider);

    Quindi, chiama getRedirectResult() per visualizzare i risultati quando l'utente torna alla tua app:

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

    Versione 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. Recupera gli attributi utente associati al provider SAML dall'ID utilizzando la dichiarazione firebase.sign_in_attributes. Assicurati di verificare utilizzando SDK Admin quando lo invii al tuo server.

    Il token ID include l'indirizzo email dell'utente solo se è specificato nel Attributo NameID dell'asserzione SAML del provider di identità:

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

    Questa informazione viene compilata nel token ID emesso da Firebase e nell'oggetto UserInfo.

Attualmente, solo il fornitore di servizi ha avviato flussi SAML dall'SDK del client sono supportati.

Collegamento degli account utente

Se un utente ha già eseguito l'accesso alla tua app utilizzando un metodo diverso (ad esempio, email/password), puoi collegare il suo account esistente al provider SAML utilizzando linkWithPopup() o linkWithRedirect(): Ad esempio, possiamo collegarci a un Account Google:

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

Versione web 8

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

Passaggi successivi