Wenn Sie ein Upgrade auf Firebase Authentication with Identity Platform durchgeführt haben, können Sie Ihre Nutzer mit Firebase authentifizieren. Dazu verwenden Sie den OIDC-kompatiblen Anbieter Ihrer Wahl. So können Sie Identitätsanbieter verwenden, die von Firebase nicht nativ unterstützt werden.
Hinweis
Wenn Sie Nutzer über einen OIDC-Anbieter anmelden möchten, müssen Sie zuerst einige Informationen vom Anbieter abrufen:
Client-ID: Ein für den Anbieter eindeutiger String, der Ihre App identifiziert. Ihr Anbieter weist Ihnen möglicherweise für jede unterstützte Plattform eine andere Client-ID zu. Dies ist einer der Werte des
aud-Claims in ID-Tokens, die von Ihrem Anbieter ausgestellt werden.Clientschlüssel: Ein geheimer String, mit dem der Anbieter die Inhaberschaft einer Client-ID bestätigt. Für jede Client-ID benötigen Sie einen passenden Clientschlüssel. Dieser Wert ist nur erforderlich, wenn Sie den Autorisierungs-Code-Prozess verwenden, was dringend empfohlen wird.
Aussteller: Ein String, der Ihren Anbieter identifiziert. Dieser Wert muss eine URL sein, die, wenn sie mit
/.well-known/openid-configurationergänzt wird, den Speicherort des OIDC-Discovery-Dokuments des Anbieters angibt. Wenn der Aussteller beispielsweisehttps://auth.example.comist, muss das Discovery-Dokument unterhttps://auth.example.com/.well-known/openid-configurationverfügbar sein.
Wenn Sie die oben genannten Informationen haben, aktivieren Sie OpenID Connect als Anmeldeanbieter für Ihr Firebase-Projekt:
Wenn Sie noch nicht auf Firebase Authentication with Identity Platform aktualisiert haben, holen Sie das bitte nach. Die OpenID Connect-Authentifizierung ist nur in aktualisierten Projekten verfügbar.
Klicken Sie in der Firebase-Konsole auf der Seite Anbieter für Anmeldungen auf Neuen Anbieter hinzufügen und dann auf OpenID Connect.
Wählen Sie aus, ob Sie den Autorisierungscode-Vorgang oder den impliziten Berechtigungsvorgang verwenden möchten.
Sie sollten immer den Code-Ablauf verwenden, wenn Ihr Anbieter ihn unterstützt. Der implizite Ablauf ist weniger sicher und seine Verwendung wird dringend abgeraten.
Geben Sie einen Namen für diesen Anbieter ein. Notieren Sie sich die generierte Anbieter-ID, z. B.
oidc.example-provider. Sie benötigen diese ID, wenn Sie Ihrer App Anmeldecode hinzufügen.Geben Sie Ihre Client-ID und Ihren Clientschlüssel sowie den Ausstellerstring Ihres Anbieters an. Diese Werte müssen genau mit den Werten übereinstimmen, die Ihr Anbieter Ihnen zugewiesen hat.
Speichern Sie die Änderungen.
Anmeldevorgang mit dem Firebase SDK verarbeiten
Wenn Sie eine Android-App entwickeln, ist es am einfachsten, Ihre Nutzer mit Firebase über Ihren OIDC-Anbieter zu authentifizieren, indem Sie den gesamten Anmeldevorgang mit dem Firebase Android SDK abwickeln.
So handhaben Sie den Anmeldevorgang mit dem Firebase Android SDK:
Erstellen Sie eine Instanz von OAuthProvider mit dem Builder und der ID des Anbieters.
Kotlin
val providerBuilder = OAuthProvider.newBuilder("oidc.example-provider")
Java
OAuthProvider.Builder providerBuilder = OAuthProvider.newBuilder("oidc.example-provider");
Optional: Geben Sie zusätzliche benutzerdefinierte OAuth-Parameter an, die Sie mit der OAuth-Anfrage senden möchten.
Kotlin
// Target specific email with login hint. providerBuilder.addCustomParameter("login_hint", "user@example.com")
Java
// Target specific email with login hint. providerBuilder.addCustomParameter("login_hint", "user@example.com");
Erkundigen Sie sich bei Ihrem OIDC-Anbieter nach den unterstützten Parametern. Hinweis: Firebase-Parameter können nicht mit
setCustomParameters()übergeben werden. Diese Parameter sind client_id, response_type, redirect_uri, state, scope und response_mode.Optional: Geben Sie zusätzliche OAuth 2.0-Bereiche an, die Sie vom Authentifizierungsanbieter anfordern möchten.
Kotlin
// Request read access to a user's email addresses. // This must be preconfigured in the app's API permissions. providerBuilder.scopes = listOf("mail.read", "calendars.read")
Java
// Request read access to a user's email addresses. // This must be preconfigured in the app's API permissions. List<String> scopes = new ArrayList<String>() { { add("mail.read"); add("calendars.read"); } }; providerBuilder.setScopes(scopes);
Wenden Sie sich an Ihren OIDC-Anbieter, um zu erfahren, welche Bereiche er verwendet.
Mit Firebase über das OAuth-Anbieterobjekt authentifizieren. Beachten Sie, dass im Gegensatz zu anderen FirebaseAuth-Vorgängen hierbei die Kontrolle über Ihre UI übernommen wird, indem ein benutzerdefinierter Chrome-Tab geöffnet wird. Verweisen Sie daher nicht auf Ihre Aktivität in den Listenern
OnSuccessListenerundOnFailureListener, die Sie anhängen, da sie sofort getrennt werden, wenn der Vorgang die Benutzeroberfläche startet.Prüfen Sie zuerst, ob Sie bereits eine Antwort erhalten haben. Bei der Anmeldung mit dieser Methode wird Ihre Aktivität im Hintergrund ausgeführt, was bedeutet, dass das System sie während des Anmeldevorgangs zurückrufen kann. Damit der Nutzer es nicht noch einmal versuchen muss, sollten Sie prüfen, ob bereits ein Ergebnis vorhanden ist.
Rufen Sie
getPendingAuthResultauf, um zu prüfen, ob ein Ergebnis aussteht:Kotlin
val pendingResultTask = firebaseAuth.pendingAuthResult if (pendingResultTask != null) { // There's something already here! Finish the sign-in for your user. pendingResultTask .addOnSuccessListener { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } .addOnFailureListener { // Handle failure. } } else { // There's no pending result so you need to start the sign-in flow. // See below. }
Java
Task<AuthResult> pendingResultTask = firebaseAuth.getPendingAuthResult(); if (pendingResultTask != null) { // There's something already here! Finish the sign-in for your user. pendingResultTask .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } }); } else { // There's no pending result so you need to start the sign-in flow. // See below. }
Rufen Sie
startActivityForSignInWithProviderauf, um den Anmeldevorgang zu starten:Kotlin
firebaseAuth .startActivityForSignInWithProvider(activity, provider.build()) .addOnSuccessListener { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } .addOnFailureListener { // Handle failure. }
Java
firebaseAuth .startActivityForSignInWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
Die obigen Beispiele konzentrieren sich zwar auf Anmeldeabläufe, Sie können aber auch einen OIDC-Anbieter mit einem vorhandenen Nutzer verknüpfen, indem Sie
startActivityForLinkWithProviderverwenden. Sie können beispielsweise mehrere Anbieter mit demselben Nutzer verknüpfen, sodass er sich mit beiden anmelden kann.Kotlin
// The user is already signed-in. val firebaseUser = firebaseAuth.currentUser!! firebaseUser .startActivityForLinkWithProvider(activity, provider.build()) .addOnSuccessListener { // Provider credential is linked to the current user. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // authResult.getCredential().getAccessToken(). // The OAuth secret can be retrieved by calling: // authResult.getCredential().getSecret(). } .addOnFailureListener { // Handle failure. }
Java
// The user is already signed-in. FirebaseUser firebaseUser = firebaseAuth.getCurrentUser(); firebaseUser .startActivityForLinkWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // Provider credential is linked to the current user. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // authResult.getCredential().getAccessToken(). // The OAuth secret can be retrieved by calling: // authResult.getCredential().getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
Dasselbe Muster kann mit
startActivityForReauthenticateWithProviderverwendet werden, um neue Anmeldedaten für vertrauliche Vorgänge abzurufen, für die eine aktuelle Anmeldung erforderlich ist.Kotlin
// The user is already signed-in. val firebaseUser = firebaseAuth.currentUser!! firebaseUser .startActivityForReauthenticateWithProvider(activity, provider.build()) .addOnSuccessListener { // User is re-authenticated with fresh tokens and // should be able to perform sensitive operations // like account deletion and email or password // update. } .addOnFailureListener { // Handle failure. }
Java
// The user is already signed-in. FirebaseUser firebaseUser = firebaseAuth.getCurrentUser(); firebaseUser .startActivityForReauthenticateWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is re-authenticated with fresh tokens and // should be able to perform sensitive operations // like account deletion and email or password // update. } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
Anmeldevorgang manuell verarbeiten
Wenn Sie den OpenID Connect-Anmeldevorgang bereits in Ihrer App implementiert haben, können Sie das ID-Token direkt zur Authentifizierung bei Firebase verwenden:
Kotlin
val providerId = "oidc.example-provider" // As registered in Firebase console. val credential = oAuthCredential(providerId) { setIdToken(idToken) // ID token from OpenID Connect flow. } Firebase.auth .signInWithCredential(credential) .addOnSuccessListener { authResult -> // User is signed in. // IdP data available in: // authResult.additionalUserInfo.profile } .addOnFailureListener { e -> // Handle failure. }
Java
AuthCredential credential = OAuthProvider .newCredentialBuilder("oidc.example-provider") // As registered in Firebase console. .setIdToken(idToken) // ID token from OpenID Connect flow. .build(); FirebaseAuth.getInstance() .signInWithCredential(credential) .addOnSuccessListener(new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is signed in. // IdP data available in: // authResult.getAdditionalUserInfo().getProfile() } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
Nächste Schritte
Wenn sich ein Nutzer zum ersten Mal anmeldet, wird ein neues Nutzerkonto erstellt und mit den Anmeldedaten verknüpft, mit denen sich der Nutzer angemeldet hat, also mit dem Nutzernamen und Passwort, der Telefonnummer oder den Informationen des Authentifizierungsanbieters. Dieses neue Konto wird als Teil Ihres Firebase-Projekts gespeichert und kann verwendet werden, um einen Nutzer in allen Apps in Ihrem Projekt zu identifizieren, unabhängig davon, wie sich der Nutzer anmeldet.
-
In Ihren Apps können Sie die grundlegenden Profilinformationen des Nutzers aus dem
FirebaseUser-Objekt abrufen. Weitere Informationen finden Sie unter Nutzer verwalten. In Ihren Firebase Realtime Database- und Cloud Storage-Sicherheitsregeln können Sie die eindeutige Nutzer-ID des angemeldeten Nutzers aus der Variablen
authabrufen und damit steuern, auf welche Daten ein Nutzer zugreifen kann.
Sie können Nutzern erlauben, sich mit mehreren Authentifizierungsanbietern in Ihrer App anzumelden, indem Sie Anmeldedaten des Authentifizierungsanbieters mit einem vorhandenen Nutzerkonto verknüpfen.
Rufen Sie
signOut auf, um einen Nutzer abzumelden:
Kotlin
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();