Wenn Sie mit Identity Platform auf Firebase Authentication aktualisiert haben, können Sie Ihre Benutzer bei Firebase über den OpenID Connect (OIDC)-kompatiblen Anbieter Ihrer Wahl authentifizieren. Dadurch ist es möglich, Identitätsanbieter zu verwenden, die von Firebase nicht nativ unterstützt werden.
Bevor Sie beginnen
Um Benutzer über einen OIDC-Anbieter anzumelden, müssen Sie zunächst einige Informationen vom Anbieter sammeln:
Client-ID : Eine für den Anbieter eindeutige Zeichenfolge, die Ihre App identifiziert. Ihr Anbieter weist Ihnen möglicherweise für jede von Ihnen unterstützte Plattform eine andere Client-ID zu. Dies ist einer der Werte des
aud
Anspruchs in ID-Tokens, die von Ihrem Anbieter ausgegeben werden.Client-Geheimnis : Eine geheime Zeichenfolge, die der Anbieter verwendet, um den Besitz einer Client-ID zu bestätigen. Für jede Client-ID benötigen Sie ein passendes Client-Geheimnis. (Dieser Wert ist nur erforderlich, wenn Sie den Authentifizierungscode-Flow verwenden, was dringend empfohlen wird.)
Aussteller : Eine Zeichenfolge, die Ihren Anbieter identifiziert. Dieser Wert muss eine URL sein, die, wenn sie mit
/.well-known/openid-configuration
angehängt wird, den Speicherort des OIDC-Erkennungsdokuments des Anbieters angibt. Wenn der Aussteller beispielsweisehttps://auth.example.com
ist, muss das Erkennungsdokument unterhttps://auth.example.com/.well-known/openid-configuration
verfügbar sein.
Nachdem Sie über die oben genannten Informationen verfügen, aktivieren Sie OpenID Connect als Anmeldeanbieter für Ihr Firebase-Projekt:
Wenn Sie noch kein Upgrade auf Firebase Authentication mit Identity Platform durchgeführt haben, tun Sie dies. Die OpenID Connect-Authentifizierung ist nur in aktualisierten Projekten verfügbar.
Klicken Sie auf der Seite „Anmeldeanbieter“ der Firebase-Konsole auf Neuen Anbieter hinzufügen und dann auf OpenID Connect .
Wählen Sie aus, ob Sie den Autorisierungscode-Flow oder den impliziten Grant-Flow verwenden möchten.
Sie sollten immer den Codefluss verwenden, wenn Ihr Anbieter dies unterstützt . Der implizite Fluss ist weniger sicher und von seiner Verwendung wird dringend abgeraten.
Geben Sie diesem Anbieter einen Namen. Beachten Sie die generierte Anbieter-ID: etwa
oidc.example-provider
. Sie benötigen diese ID, wenn Sie Ihrer App einen Anmeldecode hinzufügen.Geben Sie Ihre Client-ID und Ihr Client-Geheimnis sowie die Ausstellerzeichenfolge Ihres Anbieters an. Diese Werte müssen genau mit den Werten übereinstimmen, die Ihnen Ihr Provider zugewiesen hat.
Speichern Sie Ihre Änderungen.
Behandeln Sie den Anmeldevorgang mit dem Firebase SDK
Der einfachste Weg, Ihre Benutzer bei Firebase mithilfe Ihres OIDC-Anbieters zu authentifizieren, besteht darin, den gesamten Anmeldevorgang mit dem Firebase SDK abzuwickeln.
Führen Sie die folgenden Schritte aus, um den Anmeldevorgang mit dem Firebase Apple Platforms SDK abzuwickeln:
Fügen Sie Ihrem Xcode-Projekt benutzerdefinierte URL-Schemata hinzu:
- Öffnen Sie Ihre Projektkonfiguration: Doppelklicken Sie auf den Projektnamen in der linken Baumansicht. Wählen Sie Ihre App im Abschnitt „ZIELE“ aus, wählen Sie dann die Registerkarte „Info“ aus und erweitern Sie den Abschnitt „URL-Typen“ .
- Klicken Sie auf die Schaltfläche „+“ und fügen Sie Ihre verschlüsselte App-ID als URL-Schema hinzu. Sie finden Ihre verschlüsselte App-ID auf der Seite „Allgemeine Einstellungen“ der Firebase-Konsole im Abschnitt für Ihre iOS-App. Lassen Sie die anderen Felder leer.
Nach Abschluss sollte Ihre Konfiguration etwa wie folgt aussehen (jedoch mit Ihren anwendungsspezifischen Werten):
Erstellen Sie eine Instanz eines
OAuthProvider
mit der Anbieter-ID, die Sie in der Firebase-Konsole erhalten haben.Schnell
var provider = OAuthProvider(providerID: "oidc.example-provider")
Ziel c
FIROAuthProvider *provider = [FIROAuthProvider providerWithProviderID:@"oidc.example-provider"];
Optional : Geben Sie zusätzliche benutzerdefinierte OAuth-Parameter an, die Sie mit der OAuth-Anfrage senden möchten.
Schnell
provider.customParameters = [ "login_hint": "user@example.com" ]
Ziel c
[provider setCustomParameters:@{@"login_hint": @"user@example.com"}];
Erkundigen Sie sich bei Ihrem Anbieter nach den unterstützten Parametern. Beachten Sie, dass Sie mit
setCustomParameters
keine für Firebase erforderlichen Parameter übergeben können. Diese Parameter sindclient_id
,response_type
,redirect_uri
,state
,scope
undresponse_mode
.Optional : Geben Sie über das Basisprofil hinaus zusätzliche OAuth 2.0-Bereiche an, die Sie vom Authentifizierungsanbieter anfordern möchten.
Schnell
provider.scopes = ["mail.read", "calendars.read"]
Ziel c
[provider setScopes:@[@"mail.read", @"calendars.read"]];
Erkundigen Sie sich bei Ihrem Anbieter nach den von ihm unterstützten Bereichen.
Optional : Wenn Sie die Art und Weise anpassen möchten, wie Ihre App den
SFSafariViewController
oderUIWebView
beim Anzeigen des reCAPTCHA für den Benutzer darstellt, erstellen Sie eine benutzerdefinierte Klasse, die demAuthUIDelegate
Protokoll entspricht.Authentifizieren Sie sich bei Firebase mithilfe des OAuth-Anbieterobjekts.
Schnell
// If you created a custom class that conforms to AuthUIDelegate, // pass it instead of nil: provider.getCredentialWith(nil) { credential, error in if error != nil { // Handle error. } if credential != nil { Auth().signIn(with: credential) { authResult, error in if error != nil { // Handle error. } // User is signed in. // IdP data available in authResult.additionalUserInfo.profile. // OAuth access token can also be retrieved: // (authResult.credential as? OAuthCredential)?.accessToken // OAuth ID token can also be retrieved: // (authResult.credential as? OAuthCredential)?.idToken } } }
Ziel c
// If you created a custom class that conforms to AuthUIDelegate, // pass it instead of nil: [provider getCredentialWithUIDelegate:nil completion:^(FIRAuthCredential *_Nullable credential, NSError *_Nullable error) { if (error) { // Handle error. } if (credential) { [[FIRAuth auth] signInWithCredential:credential completion:^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) { if (error) { // Handle error. } // User is signed in. // IdP data available in authResult.additionalUserInfo.profile. // OAuth access token can also be retrieved: // ((FIROAuthCredential *)authResult.credential).accessToken // OAuth ID token can also be retrieved: // ((FIROAuthCredential *)authResult.credential).idToken }]; } }];
Während sich die obigen Beispiele auf Anmeldeabläufe konzentrieren, haben Sie auch die Möglichkeit, einen OIDC-Anbieter mithilfe von
linkWithCredential
mit einem vorhandenen Benutzer zu verknüpfen. Sie können beispielsweise mehrere Anbieter mit demselben Benutzer verknüpfen, sodass sich diese bei beiden anmelden können.Schnell
Auth().currentUser.link(withCredential: credential) { authResult, error in if error != nil { // Handle error. } // OIDC credential is linked to the current user. // IdP data available in authResult.additionalUserInfo.profile. // OAuth access token can also be retrieved: // (authResult.credential as? OAuthCredential)?.accessToken // OAuth ID token can also be retrieved: // (authResult.credential as? OAuthCredential)?.idToken }
Ziel c
[[FIRAuth auth].currentUser linkWithCredential:credential completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) { if (error) { // Handle error. } // OIDC credential is linked to the current user. // IdP data available in authResult.additionalUserInfo.profile. // OAuth access token can also be retrieved: // ((FIROAuthCredential *)authResult.credential).accessToken // OAuth ID token can also be retrieved: // ((FIROAuthCredential *)authResult.credential).idToken }];
Das gleiche Muster kann mit
reauthenticateWithCredential
verwendet werden, mit dem neue Anmeldeinformationen für vertrauliche Vorgänge abgerufen werden können, die eine kürzliche Anmeldung erfordern.Schnell
Auth().currentUser.reauthenticateWithCredential(withCredential: credential) { authResult, error in if error != nil { // Handle error. } // User is re-authenticated with fresh tokens minted and // should be able to perform sensitive operations like account // deletion and email or password update. // IdP data available in result.additionalUserInfo.profile. // Additional OAuth access token can also be retrieved: // (authResult.credential as? OAuthCredential)?.accessToken // OAuth ID token can also be retrieved: // (authResult.credential as? OAuthCredential)?.idToken }
Ziel c
[[FIRAuth auth].currentUser reauthenticateWithCredential:credential completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) { if (error) { // Handle error. } // User is re-authenticated with fresh tokens minted and // should be able to perform sensitive operations like account // deletion and email or password update. // IdP data available in result.additionalUserInfo.profile. // Additional OAuth access token can also be retrieved: // ((FIROAuthCredential *)authResult.credential).accessToken // OAuth ID token can also be retrieved: // ((FIROAuthCredential *)authResult.credential).idToken }];
Behandeln Sie den Anmeldevorgang manuell
Wenn Sie den OpenID Connect-Anmeldeablauf bereits in Ihrer App implementiert haben, können Sie das ID-Token direkt zur Authentifizierung bei Firebase verwenden:
Schnell
let credential = OAuthProvider.credential(
withProviderID: "oidc.example-provider", // As registered in Firebase console.
idToken: idToken, // ID token from OpenID Connect flow.
rawNonce: nil
)
Auth.auth().signIn(with: credential) { authResult, error in
if error {
// Handle error.
return
}
// User is signed in.
// IdP data available in authResult?.additionalUserInfo?.profile
}
Ziel c
FIROAuthCredential *credential =
[FIROAuthProvider credentialWithProviderID:@"oidc.example-provider" // As registered in Firebase console.
IDToken:idToken // ID token from OpenID Connect flow.
rawNonce:nil];
[[FIRAuth auth] signInWithCredential:credential
completion:^(FIRAuthDataResult * _Nullable authResult,
NSError * _Nullable error) {
if (error != nil) {
// Handle error.
return;
}
// User is signed in.
// IdP data available in authResult.additionalUserInfo.profile
}];
Nächste Schritte
Nachdem sich ein Benutzer zum ersten Mal angemeldet hat, wird ein neues Benutzerkonto erstellt und mit den Anmeldeinformationen – also dem Benutzernamen und dem Kennwort, der Telefonnummer oder den Informationen zum Authentifizierungsanbieter – verknüpft, mit denen sich der Benutzer angemeldet hat. Dieses neue Konto wird als Teil Ihres Firebase-Projekts gespeichert und kann zur Identifizierung eines Benutzers in jeder App in Ihrem Projekt verwendet werden, unabhängig davon, wie sich der Benutzer anmeldet.
In Ihren Apps können Sie die grundlegenden Profilinformationen des Benutzers aus dem
User
Objekt abrufen. Siehe Benutzer verwalten .In Ihren Firebase-Echtzeitdatenbank- und Cloud-Speicher- Sicherheitsregeln können Sie die eindeutige Benutzer-ID des angemeldeten Benutzers aus der
auth
abrufen und damit steuern, auf welche Daten ein Benutzer zugreifen kann.
Sie können Benutzern die Anmeldung bei Ihrer App mit mehreren Authentifizierungsanbietern ermöglichen, indem Sie die Anmeldeinformationen des Authentifizierungsanbieters mit einem vorhandenen Benutzerkonto verknüpfen.
Um einen Benutzer abzumelden, rufen Sie signOut:
auf.
Schnell
let firebaseAuth = Auth.auth() do { try firebaseAuth.signOut() } catch let signOutError as NSError { print("Error signing out: %@", signOutError) }
Ziel c
NSError *signOutError; BOOL status = [[FIRAuth auth] signOut:&signOutError]; if (!status) { NSLog(@"Error signing out: %@", signOutError); return; }
Möglicherweise möchten Sie auch Fehlerbehandlungscode für alle Authentifizierungsfehler hinzufügen. Siehe Fehler behandeln .