Nutzer mit SAML anmelden

In diesem Artikel erfahren Sie, wie Sie Nutzer mit Identity Platform bei einem SAML-Anbieter (Security Assertion Markup Language) 2.0 anmelden.

Hinweis

  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. Aktivieren Sie Identity Platform und fügen Sie das Client SDK zu Ihrer Anwendung hinzu. Weitere Informationen finden Sie in der Kurzanleitung.

Anbieter konfigurieren

  1. Rufen Sie in der Google Cloud Console die Seite Identitätsanbieter auf.
    Zur Seite "Identitätsanbieter"

  2. Klicken Sie auf Anbieter hinzufügen und wählen Sie SAML aus der Liste aus.

  3. Geben Sie die folgenden Informationen ein:

    1. Name des Anbieters. Dieser kann die Anbieter-ID oder ein benutzerdefinierter Name sein. Wenn Sie einen benutzerdefinierten Namen eingeben, klicken Sie neben Anbieter-ID auf Bearbeiten, um die ID anzugeben. Diese muss mit saml. beginnen.

    2. Die Entitäts-ID des Anbieters.

    3. Die SAML-SSO-URL des Anbieters.

    4. Das Zertifikat, das für die Tokensignatur beim Anbieter verwendet wird. Achten Sie darauf, die Start- und Endstrings anzugeben. Beispiel:

      -----BEGIN CERTIFICATE-----
      MIICajCCAdOgAwIBAgIBADANBgkqhkiG9w0BAQ0FADBSMQswCQYDVQQGEwJ1czEL
      ...
      LEzc1JwEGQQVDYQCwsQMSBDAF0QAB0w9GikhqkgBNADABIgABIwAgOdACCjaCIIM
      -----END CERTIFICATE-----
      
  4. Geben Sie unter Dienstanbieter die Entitäts-ID Ihrer Anwendung ein. Das ist in der Regel die URL Ihrer Anwendung. Bei Ihrem SAML-Identitätsanbieter wird dies als Zielgruppe bezeichnet.

  5. Fügen Sie Ihre Anwendung zur Liste der autorisierten Domains hinzu. Wenn die Anmelde-URL Ihrer Anwendung beispielsweise https://example.com/login lautet, fügen Sie example.com hinzu.

  6. Passen Sie gegebenenfalls die Callback-URL für Ihre Anwendung an. Die URL wird in der Regel von SAML-Identitätsanbietern für die ACS-URL (Assertion Consumer Service) verwendet.

    Die Verwendung der Standard-Callback-URL vereinfacht die Validierung der SAML-Antwort. Wenn Sie diesen Ablauf anpassen, achten Sie darauf, dass die Callback-URL des Identity Platform-Projekts für Ihr Projekt in Ihrem SAML-Identitätsanbieter konfiguriert ist. Das sieht normalerweise so aus: https://[PROJECT-ID].firebaseapp.com/__/auth/handler. Weitere Informationen finden Sie unter Authentifizierungs-Handler anpassen.

  7. Klicken Sie auf Speichern.

Erforderliche Elemente des Anbieters

Identity Platform erwartet die Elemente <saml:Subject> und <saml:NameID> in Antworten des Anbieters. Wenn Sie bei der Konfiguration Ihres Anbieters keine Werte für diese Elemente definieren, schlägt die SAML-Assertion fehl.

Signieranfragen

Sie können die Sicherheit Ihrer Authentifizierungsanfragen erhöhen, indem Sie sie signieren.

Wenn Sie Anfragen signieren möchten, müssen Sie zuerst signierte Anfragen für Ihren Identitätsanbieter aktivieren. Rufen Sie dazu inboundSamlConfigs.patch() auf und legen Sie idp_config.sign_request auf true fest:

REST

Ersetzen Sie diese Werte in den folgenden Anfragedaten:

  • project-id: die ID für das Google Cloud-Projekt
  • provider-id: die SAML-Anbieter-ID

HTTP-Methode und URL:

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

JSON-Text anfordern:

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

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

 

Sie müssen die REST API verwenden, um signierte Anfragen zu aktivieren; die Google Cloud Console oder die Google Cloud CLI werden nicht unterstützt.

Die Antwort ist ein InboundSamlConfig-Objekt, das ein Array von SpCertificate enthält. Konfigurieren Sie den Wert des X509-Zertifikats mit Ihrem SAML-Identitätsanbieter, um die Signatur Ihrer Anfragen zu prüfen.

Nutzer anmelden

Wenn Sie einen Nutzer anmelden, verarbeitet das Client SDK die Authentifizierungsfehler und gibt dann ID-Tokens zurück, die die SAML-Attribute in ihren Nutzlasten enthalten. So melden Sie einen Nutzer an und rufen Attribute vom SAML-Anbieter ab:

  1. Erstellen Sie eine SAMLAuthProvider-Instanz mit der Anbieter-ID, die Sie im vorherigen Abschnitt konfiguriert haben. Die Anbieter-ID muss mit saml. beginnen.

    Webversion 9

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

    Web version 8

    const provider = new firebase.auth.SAMLAuthProvider('saml.myProvider');
  2. Starten Sie den Anmeldevorgang. Sie können entweder ein Pop-up-Fenster oder eine Weiterleitung verwenden.

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

    Weiterleiten

    Rufen Sie signInWithRedirect() auf, um Nutzer auf eine Anmeldeseite weiterzuleiten.

    Web version 9

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

    Webversion 8

    firebase.auth().signInWithRedirect(provider);

    Rufen Sie dann getRedirectResult() auf, um die Ergebnisse abzurufen, wenn der Nutzer zu Ihrer Anwendung zurückgeleitet wird:

    Webversion 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 version 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. Rufen Sie mithilfe der Anforderung firebase.sign_in_attributes die Nutzerattribute, die dem SAML-Anbieter zugeordnet sind, aus dem ID-Token ab. Prüfen Sie das ID-Token mit dem Admin SDK, wenn Sie es an Ihren Server senden.

    Das ID-Token enthält nur dann die E-Mail-Adresse des Nutzers, wenn sie im NameID-Attribut der SAML-Assertion vom Identitätsanbieter:

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

    Dieser wird im von Firebase ausgestellten ID-Token und im Objekt UserInfo eingefügt.

Derzeit werden nur vom Dienstanbieter initiierte SAML-Abläufe aus dem Client SDK unterstützt.

Nutzerkonten verknüpfen

Wenn sich ein Nutzer bereits mit einer anderen Methode (z. B. E-Mail/Passwort) in Ihrer App angemeldet hat, können Sie sein vorhandenes Konto über linkWithPopup() oder linkWithRedirect() mit dem SAML-Anbieter verknüpfen: Wir können beispielsweise eine Verknüpfung mit einem Google-Konto herstellen:

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

Webversion 8

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

Nächste Schritte