SAML- und OIDC-Anbieter programmatisch verwalten

In diesem Artikel erfahren Sie, wie Sie mit dem Identity Platform Admin SDK die Anbieterkonfigurationen der Security Assertion Markup Language (SAML) 2.0 und von OIDC (OpenID Connect) programmatisch verwalten.

Mit dem Admin SDK können Sie automatisch Anbieter konfigurieren, einfache CRUD-Vorgänge ausführen, Zertifikate rotieren und vieles mehr. Dies ist nützlich, wenn Sie eine große Anzahl von Anbietern haben, deren manuelle Verwaltung umständlich wäre über die Google Cloud Console.

Hinweis

Mit SAML-Anbietern arbeiten

SAML-Anbieterkonfiguration erstellen

Zum Erstellen einer SAML-Anbieterkonfiguration müssen Sie die im Folgenden aufgeführten Parameter angeben. Ausführliche Informationen zum Abrufen einiger Werte erhalten Sie in der Dokumentation Ihres Identitätsanbieters.

Anzeigename
Ein nutzerfreundlicher Anzeigename für die Konfiguration. Dieser Name dient auch als Anbieterlabel in der Google Cloud Console.
Aktiviert
Gibt an, ob die aktuelle Anbieterkonfiguration aktiviert oder deaktiviert ist. Nutzer können sich mit deaktivierten Anbietern nicht anmelden.
Anbieter-ID
Die eindeutige Kennung des Anbieters, die mit saml. beginnt.
Entitäts-ID des Identitätsanbieters
Die Entitäts-ID für den Anbieter.
SSO-URL
Die SAML-SSO-URL des Anbieters. Die URL muss gültig sein.
X.509-Zertifikate

Eine Liste der X.509-Zertifikate des SAML-Anbieters, einschließlich der Strings -----BEGIN CERTIFICATE----- und -----END CERTIFICATE----. Diese werden für die Tokensignatur beim Identitätsanbieter verwendet.

Wenn Identity Platform eine SAML-Antwort empfängt, wird die Signatur anhand eines eingetragenen Zertifikats geprüft. Wenn die Prüfung fehlschlägt, wird die Antwort abgelehnt. Sollten Schlüssel rotiert werden, müssen Sie diese Zertifikate aktualisieren. Prüfen Sie die Möglichkeit, mehrere Zertifikate hochzuladen, um Ausfälle während der Rotation zu vermeiden.

Entitäts-ID der vertrauenden Seite
Die Entitäts-ID der SAML-Anwendung (RP/SP). Dies ist in der Regel die URL der Anwendung. Im SAML-Identitätsanbieter wird diese als Zielgruppe behandelt.
Rückruf-URL

URL, zu der bei Abschluss der Authentifizierung zurückgekehrt werden soll. Für SAML-Anbieter ist dies im Allgemeinen die ACS-URL (Assertion Consumer Service). Sie müssen diese URL beim SAML-Anbieter registrieren. Es sollte in etwa so aussehen: https://PROJECT-ID.firebaseapp.com/__/auth/handler, ähnlich wie die in der Google Cloud Console angezeigten URLs. Weitere Informationen finden Sie unter Nutzer mit SAML anmelden.

Die Verwendung der Standard-Callback-URL verringert die Komplexität der Validierung von SAML-Antworten. Sie können aber auch eine benutzerdefinierte Domain angeben. Achten Sie in diesem Fall darauf, dass die Callback-URL von Identity Platform für Ihr Projekt ordnungsgemäß mit Ihrem SAML-Identitätsanbieter konfiguriert ist. In der Regel sieht diese in etwa so aus: https://AUTH-DOMAIN/__/auth/handler.

Das folgende Beispiel zeigt, wie eine SAML-Anbieterkonfiguration erstellt wird:

Node.js

const newConfig = {
  displayName: 'SAML provider name',
  enabled: true,
  providerId: 'saml.myProvider',
  idpEntityId: 'IDP_ENTITY_ID',
  ssoURL: 'https://example.com/saml/sso/1234/'
  x509Certificates: [
    '-----BEGIN CERTIFICATE-----\nCERT1...\n-----END CERTIFICATE-----',
    '-----BEGIN CERTIFICATE-----\nCERT2...\n-----END CERTIFICATE-----',
  ],
  rpEntityId: 'RP_ENTITY_ID',
  // Using the default callback URL.
  callbackURL: 'https://project-id.firebaseapp.com/__/auth/handler',
};
admin.auth().createProviderConfig(newConfig).then(() => {
  // Successful creation.
}).catch((error) => {
  // Handle error.
});

Go

newConfig := (&auth.SAMLProviderConfigToCreate{}).
	DisplayName("SAML provider name").
	Enabled(true).
	ID("saml.myProvider").
	IDPEntityID("IDP_ENTITY_ID").
	SSOURL("https://example.com/saml/sso/1234/").
	X509Certificates([]string{
		"-----BEGIN CERTIFICATE-----\nCERT1...\n-----END CERTIFICATE-----",
		"-----BEGIN CERTIFICATE-----\nCERT2...\n-----END CERTIFICATE-----",
	}).
	RPEntityID("RP_ENTITY_ID").
	CallbackURL("https://project-id.firebaseapp.com/__/auth/handler")
saml, err := client.CreateSAMLProviderConfig(ctx, newConfig)
if err != nil {
	log.Fatalf("error creating SAML provider: %v\n", err)
}

log.Printf("Created new SAML provider: %s", saml.ID)

Python

saml = auth.create_saml_provider_config(
    display_name='SAML provider name',
    enabled=True,
    provider_id='saml.myProvider',
    idp_entity_id='IDP_ENTITY_ID',
    sso_url='https://example.com/saml/sso/1234/',
    x509_certificates=[
        '-----BEGIN CERTIFICATE-----\nCERT1...\n-----END CERTIFICATE-----',
        '-----BEGIN CERTIFICATE-----\nCERT2...\n-----END CERTIFICATE-----',
    ],
    rp_entity_id='P_ENTITY_ID',
    callback_url='https://project-id.firebaseapp.com/__/auth/handler')

print('Created new SAML provider:', saml.provider_id)

Java

SamlProviderConfig.CreateRequest request = new SamlProviderConfig.CreateRequest()
    .setDisplayName("SAML provider name")
    .setEnabled(true)
    .setProviderId("saml.myProvider")
    .setIdpEntityId("IDP_ENTITY_ID")
    .setSsoUrl("https://example.com/saml/sso/1234/")
    .addX509Certificate("-----BEGIN CERTIFICATE-----\nCERT1...\n-----END CERTIFICATE-----")
    .addX509Certificate("-----BEGIN CERTIFICATE-----\nCERT2...\n-----END CERTIFICATE-----")
    .setRpEntityId("RP_ENTITY_ID")
    .setCallbackUrl("https://project-id.firebaseapp.com/__/auth/handler");
SamlProviderConfig saml = FirebaseAuth.getInstance().createSamlProviderConfig(request);
System.out.println("Created new SAML provider: " + saml.getProviderId());

Bei Abschluss gibt die Methode ein SAMLAuthProviderConfig-Objekt für die neu erstellte Konfiguration zurück.

Konfiguration eines SAML-Anbieters aktualisieren

Das folgende Beispiel zeigt, wie eine SAML-Anbieterkonfiguration geändert wird. Mit Ausnahme der Anbieter-ID können Sie alle Felder ändern.

Node.js

const updatedConfig = {
  x509Certificates: [
    '-----BEGIN CERTIFICATE-----\nCERT2...\n-----END CERTIFICATE-----',
    '-----BEGIN CERTIFICATE-----\nCERT3...\n-----END CERTIFICATE-----',
  ],
};
admin.auth().updateProviderConfig('saml.myProvider', updatedConfig).then(() => {
  // Successful update.
}).catch((error) => {
  // Handle error.
});

Go

updatedConfig := (&auth.SAMLProviderConfigToUpdate{}).
	X509Certificates([]string{
		"-----BEGIN CERTIFICATE-----\nCERT2...\n-----END CERTIFICATE-----",
		"-----BEGIN CERTIFICATE-----\nCERT3...\n-----END CERTIFICATE-----",
	})
saml, err := client.UpdateSAMLProviderConfig(ctx, "saml.myProvider", updatedConfig)
if err != nil {
	log.Fatalf("error updating SAML provider: %v\n", err)
}

log.Printf("Updated SAML provider: %s", saml.ID)

Python

saml = auth.update_saml_provider_config(
    'saml.myProvider',
    x509_certificates=[
        '-----BEGIN CERTIFICATE-----\nCERT2...\n-----END CERTIFICATE-----',
        '-----BEGIN CERTIFICATE-----\nCERT3...\n-----END CERTIFICATE-----',
    ])

print('Updated SAML provider:', saml.provider_id)

Java

SamlProviderConfig.UpdateRequest request =
    new SamlProviderConfig.UpdateRequest("saml.myProvider")
      .addX509Certificate("-----BEGIN CERTIFICATE-----\nCERT2...\n-----END CERTIFICATE-----")
      .addX509Certificate("-----BEGIN CERTIFICATE-----\nCERT3...\n-----END CERTIFICATE-----");
SamlProviderConfig saml = FirebaseAuth.getInstance().updateSamlProviderConfig(request);
System.out.println("Updated SAML provider: " + saml.getProviderId());

Nach Abschluss der Methode wird für die Methode ein SAMLAuthProviderConfig-Objekt für die aktualisierte Konfiguration zurückgegeben.

SAML-Anbieterkonfiguration abrufen

Die primäre Methode zur Identifizierung einer SAML-Konfiguration ist die Verwendung der Anbieter-ID. Das folgende Beispiel zeigt, wie eine SAML-Anbieterkonfiguration abgerufen wird:

Node.js

admin.auth().getProviderConfig('saml.myProvider').then((config) => {
  // Get display name and whether it is enabled.
  console.log(config.displayName, config.enabled);
}).catch((error) => {
  // Handle error. Common error is that config is not found.
});

Go

saml, err := client.SAMLProviderConfig(ctx, "saml.myProvider")
if err != nil {
	log.Fatalf("error retrieving SAML provider: %v\n", err)
}

log.Printf("%s %t", saml.DisplayName, saml.Enabled)

Python

saml = auth.get_saml_provider_config('saml.myProvider')
print(saml.display_name, saml.enabled)

Java

SamlProviderConfig saml = FirebaseAuth.getInstance().getSamlProviderConfig("saml.myProvider");
System.out.println(saml.getDisplayName() + ": " + saml.isEnabled());

Wenn ein Anbieter mit der angegebenen ID vorhanden ist, gibt die Methode ein SAMLAuthProviderConfig-Objekt zurück.

SAML-Anbieterkonfiguration löschen

Das folgende Beispiel zeigt, wie eine SAML-Anbieterkonfiguration gelöscht wird:

Node.js

admin.auth().deleteProviderConfig('saml.myProvider').then(() => {
  // Successful deletion.
}).catch((error) => {
  // Handle error.
});

Go

if err := client.DeleteSAMLProviderConfig(ctx, "saml.myProvider"); err != nil {
	log.Fatalf("error deleting SAML provider: %v\n", err)
}

Python

auth.delete_saml_provider_config('saml.myProvider')

Java

FirebaseAuth.getInstance().deleteSamlProviderConfig("saml.myProvider");

SAML-Anbieterkonfigurationen auflisten

Das folgende Beispiel zeigt, wie Sie vorhandene SAML-Anbieterkonfigurationen auflisten:

Node.js

// Returns 10 SAML provider configs starting from the specified nextPageToken offset.
admin.auth().listProviderConfigs({type: 'saml', maxResults: 10, pageToken: 'nextPageToken'}).then((results) => {
  results.providerConfigs.forEach((config) => {
    console.log(config.providerId);
  });
  // To list the next 10:
  // return admin.auth().listProviderConfigs(
  //     {type: 'saml', maxResults: 10, pageToken: results.pageToken});
}).catch((error) => {
  // Handle error.
});

Go

iter := client.SAMLProviderConfigs(ctx, "nextPageToken")
for {
	saml, err := iter.Next()
	if err == iterator.Done {
		break
	}
	if err != nil {
		log.Fatalf("error retrieving SAML providers: %v\n", err)
	}

	log.Printf("%s\n", saml.ID)
}

Python

for saml in auth.list_saml_provider_configs('nextPageToken').iterate_all():
    print(saml.provider_id)

Java

ListProviderConfigsPage<SamlProviderConfig> page = FirebaseAuth.getInstance()
    .listSamlProviderConfigs("nextPageToken");
for (SamlProviderConfig config : page.iterateAll()) {
  System.out.println(config.getProviderId());
}

Jeder Batch von Ergebnissen enthält eine Liste der Anbieterkonfigurationen sowie ein Token für die nächste Seite zum Abrufen des nächsten Batches. Wenn alle Anbieter aufgelistet sind, wird kein Token zurückgegeben.

Standardmäßig werden 100 Anbieter mit jedem Stapel zurückgegeben. Dies ist auch die maximale Anzahl von Anbietern pro Stapel.

Mit OIDC-Anbietern arbeiten

OIDC-Anbieterkonfiguration erstellen

Zum Erstellen einer OIDC-Anbieterkonfiguration müssen Sie die im Folgenden aufgeführten Parameter angeben. Ausführliche Informationen zum Abrufen einiger Werte erhalten Sie in der Dokumentation Ihres Identitätsanbieters.

Anzeigename
Ein nutzerfreundlicher Anzeigename für die Konfiguration. Dieser Name dient auch als Anbieterlabel in der Google Cloud Console.
Aktiviert
Gibt an, ob die aktuelle Anbieterkonfiguration aktiviert oder deaktiviert ist. Nutzer können sich mit deaktivierten Anbietern nicht anmelden.
Anbieter-ID
Die eindeutige Kennung des Anbieters, die mit oidc. beginnt.
Client-ID
Die ID, mit der die Zielgruppe des ID-Tokens eines OIDC-Anbieters bestätigt wird.
Client-Secret
Der Clientschlüssel, der zum Aktivieren des OIDC-Codeablaufs erforderlich ist.
Aussteller
Die Issuer des Anbieters. Dieser sollte in etwa so aussehen: https://example.com. Identity Platform verwendet diese URL zum Ermitteln des OIDC-Discovery-Dokuments. Dies finden Sie normalerweise unter /.well-known/openid-configuration. Der Wert gibt die OAuth-Endpunkte und öffentlichen Schlüssel des Anbieters an. Identity Platform validiert ID-Tokens gemäß der OpenID Connect-Spezifikation. Wenn Ihr Anbieter die OIDC-Spezifikation für die Erkennung nicht erfüllt, kann er nicht mit Identity Platform verwendet werden.
Antworttyp
Der Antworttyp des Anbieters für den OAuth-Autorisierungsablauf. Sie können entweder {idToken, code} auf true festlegen, aber nicht beides. Wenn der Codeablauf aktiviert ist, müssen Sie einen Clientschlüssel angeben.

Das folgende Beispiel zeigt, wie eine OIDC-Anbieterkonfiguration erstellt wird, die den impliziten Autorisierungsablauf verwendet:

Node.js

const newConfig = {
  displayName: 'OIDC provider name',
  enabled: true,
  clientId: 'CLIENT_ID2',
  issuer: 'https://oidc.com/CLIENT_ID2',
  providerId: 'oidc.provider2',
  responseType: {
    idToken: true,
    code: false,
  },
};
admin.auth().createProviderConfig(newConfig).then(() => {
  // Successful creation.
}).catch((error) => {
  // Handle error.
});

Go

newConfig := (&auth.OIDCProviderConfigToCreate{}).
	DisplayName("OIDC provider name").
	Enabled(true).
	ID("oidc.myProvider").
	ClientID("CLIENT_ID2").
	Issuer("https://oidc.com/CLIENT_ID2")
oidc, err := client.CreateOIDCProviderConfig(ctx, newConfig)
if err != nil {
	log.Fatalf("error creating OIDC provider: %v\n", err)
}

log.Printf("Created new OIDC provider: %s", oidc.ID)

Python

oidc = auth.create_oidc_provider_config(
    display_name='OIDC provider name',
    enabled=True,
    provider_id='oidc.myProvider',
    client_id='CLIENT_ID2',
    issuer='https://oidc.com/CLIENT_ID2')

print('Created new OIDC provider:', oidc.provider_id)

Java

OidcProviderConfig.CreateRequest request = new OidcProviderConfig.CreateRequest()
    .setDisplayName("OIDC provider name")
    .setEnabled(true)
    .setProviderId("oidc.myProvider")
    .setClientId("CLIENT_ID2")
    .setIssuer("https://oidc.com/CLIENT_ID2");
OidcProviderConfig oidc = FirebaseAuth.getInstance().createOidcProviderConfig(request);
System.out.println("Created new OIDC provider: " + oidc.getProviderId());

Bei Abschluss gibt die Methode ein OIDCAuthProviderConfig-Objekt für die neu erstellte Konfiguration zurück.

OIDC-Anbieterkonfiguration aktualisieren

Das folgende Beispiel zeigt, wie Sie eine OIDC-Anbieterkonfiguration aktualisieren. Mit Ausnahme der Anbieter-ID können Sie alle Felder ändern.

Node.js

const updatedConfig = {
  displayName: 'OIDC provider name',
  enabled: true,
  clientId: 'CLIENT_ID',
  clientSecret: 'CLIENT_SECRET'
  issuer: 'https://oidc.com/',
  responseType: {
    code: true,
    idToken: false,
  },
};
admin.auth().updateProviderConfig('oidc.myProvider', updatedConfig).then(() => {
  // Successful update.
}).catch((error) => {
  // Handle error.
});

Go

updatedConfig := (&auth.OIDCProviderConfigToUpdate{}).
	DisplayName("OIDC provider name").
	Enabled(true).
	ClientID("CLIENT_ID").
	Issuer("https://oidc.com")
oidc, err := client.UpdateOIDCProviderConfig(ctx, "oidc.myProvider", updatedConfig)
if err != nil {
	log.Fatalf("error updating OIDC provider: %v\n", err)
}

log.Printf("Updated OIDC provider: %s", oidc.ID)

Python

oidc = auth.update_oidc_provider_config(
    'oidc.myProvider',
    client_id='CLIENT_ID',
    issuer='https://oidc.com')

print('Updated OIDC provider:', oidc.provider_id)

Java

OidcProviderConfig.UpdateRequest request =
    new OidcProviderConfig.UpdateRequest("oidc.myProvider")
        .setDisplayName("OIDC provider name")
        .setEnabled(true)
        .setClientId("CLIENT_ID")
        .setIssuer("https://oidc.com");
OidcProviderConfig oidc = FirebaseAuth.getInstance().updateOidcProviderConfig(request);
System.out.println("Updated OIDC provider: " + oidc.getProviderId());

Nach Abschluss der Methode wird für die Methode ein OIDCAuthProviderConfig-Objekt für die aktualisierte Konfiguration zurückgegeben.

OIDC-Anbieterkonfiguration abrufen

Die OIDC-Konfiguration wird hauptsächlich anhand ihrer Anbieter-ID identifiziert. Das folgende Beispiel zeigt, wie Sie eine OIDC-Anbieterkonfiguration abrufen:

Node.js

admin.auth().getProviderConfig('oidc.myProvider').then((config) => {
  // Get display name and whether it is enabled.
  console.log(config.displayName, config.enabled);
}).catch((error) => {
  // Handle error. Common error is that config is not found.
});

Go

oidc, err := client.OIDCProviderConfig(ctx, "oidc.myProvider")
if err != nil {
	log.Fatalf("error retrieving OIDC provider: %v\n", err)
}

log.Printf("%s %t", oidc.DisplayName, oidc.Enabled)

Python

oidc = auth.get_oidc_provider_config('oidc.myProvider')

print(oidc.display_name, oidc.enabled)

Java

OidcProviderConfig oidc = FirebaseAuth.getInstance().getOidcProviderConfig("oidc.myProvider");
System.out.println(oidc.getDisplayName() + ": " + oidc.isEnabled());

Wenn ein Anbieter mit der angegebenen ID vorhanden ist, gibt die Methode ein OIDCAuthProviderConfig-Objekt zurück.

OIDC-Anbieterkonfiguration löschen

Das folgende Beispiel zeigt, wie Sie eine OIDC-Anbieterkonfiguration löschen:

Node.js

admin.auth().deleteProviderConfig('oidc.myProvider').then(() => {
  // Successful deletion.
}).catch((error) => {
  // Handle error.
});

Go

if err := client.DeleteOIDCProviderConfig(ctx, "oidc.myProvider"); err != nil {
	log.Fatalf("error deleting OIDC provider: %v\n", err)
}

Python

auth.delete_oidc_provider_config('oidc.myProvider')

Java

FirebaseAuth.getInstance().deleteOidcProviderConfig("oidc.myProvider");

OIDC-Anbieterkonfigurationen auflisten

Das folgende Beispiel zeigt, wie vorhandene OIDC-Anbieterkonfigurationen aufgelistet werden:

Node.js

// Returns 10 OIDC provider configs starting from the specified nextPageToken offset.
admin.auth().listProviderConfigs({type: 'oidc', maxResults: 10, pageToken: 'nextPageToken'}).then((results) => {
  results.providerConfigs.forEach((config) => {
    console.log(config.providerId);
  });
  // To list the next 10:
  // return admin.auth().listProviderConfigs(
  //     {type: 'oidc', maxResults: 10, pageToken: results.pageToken});
}).catch((error) => {
  // Handle error.
});

Go

iter := client.OIDCProviderConfigs(ctx, "nextPageToken")
for {
	oidc, err := iter.Next()
	if err == iterator.Done {
		break
	}
	if err != nil {
		log.Fatalf("error retrieving OIDC providers: %v\n", err)
	}

	log.Printf("%s\n", oidc.ID)
}

Python

for oidc in auth.list_oidc_provider_configs('nextPageToken').iterate_all():
    print(oidc.provider_id)

Java

ListProviderConfigsPage<OidcProviderConfig> page = FirebaseAuth.getInstance()
    .listOidcProviderConfigs("nextPageToken");
for (OidcProviderConfig oidc : page.iterateAll()) {
  System.out.println(oidc.getProviderId());
}

Jeder Batch von Ergebnissen enthält eine Liste der Anbieterkonfigurationen sowie ein Token für die nächste Seite zum Abrufen des nächsten Batches. Wenn alle Anbieter aufgelistet sind, wird kein Token zurückgegeben.

Standardmäßig werden 100 Anbieter mit jedem Stapel zurückgegeben. Dies ist auch die maximale Anzahl von Anbietern pro Stapel.

Nächste Schritte