Sie können Nutzern die Authentifizierung mit Firebase über ihre Apple-ID ermöglichen, indem Sie mit dem Firebase SDK den vollständigen OAuth 2.0-Anmeldevorgang ausführen.
Hinweis
Wenn Sie Nutzer über Apple anmelden möchten, müssen Sie zuerst „Mit Apple anmelden“ auf der Apple-Entwicklerwebsite konfigurieren und dann Apple als Anmeldeanbieter für Ihr Firebase-Projekt aktivieren.
Am Apple Developer Program teilnehmen
„Mit Apple anmelden“ kann nur von Mitgliedern des Apple-Programms für Entwickler konfiguriert werden.
„Mit Apple anmelden“ konfigurieren
Gehen Sie auf der Apple Entwickler-Website so vor:
-
Verknüpfen Sie Ihre Website mit Ihrer App, wie im ersten Abschnitt von Mit Apple im Web anmelden beschrieben. Registrieren Sie die folgende URL als Rückgabe-URL, wenn Sie dazu aufgefordert werden:
https://YOUR_FIREBASE_PROJECT_ID.firebaseapp.com/__/auth/handler
Ihre Firebase-Projekt-ID finden Sie in der
Einstellungen > Tab Allgemein der Firebase Console.Notieren Sie sich die neue Dienst-ID. Sie benötigen sie im nächsten Abschnitt.
- Erstellen Sie einen privaten Schlüssel für „Mit Apple anmelden“. Sie benötigen den neuen privaten Schlüssel und die Schlüssel ID im nächsten Abschnitt.
Apple als Anmeldeanbieter aktivieren
- Fügen Sie Ihrem Android-Projekt Firebase hinzu.
-
Geben Sie den SHA-1-Fingerabdruck Ihrer App an, falls noch nicht geschehen.
-
Rufen Sie in der Firebase Console die
Einstellungen auf und wechseln Sie zum Tab Allgemein. - Scrollen Sie nach unten zur Karte Ihre Apps , wählen Sie Ihre Android-App aus und fügen Sie den SHA-1-Fingerabdruck in das Feld SHA-Zertifikat-Fingerabdrücke ein.
-
Rufen Sie in der Firebase Console die
- Wechseln Sie in der Firebase Console zu Security > Authentication.
- Aktivieren Sie auf dem Tab Anmeldemethode den Anmeldeanbieter Apple sign-in provider. Geben Sie die Dienst-ID an, die Sie im vorherigen Abschnitt erstellt haben. Geben Sie außerdem im Abschnitt OAuth-Codeablaufkonfiguration Ihre Apple-Team-ID und den privaten Schlüssel sowie die Schlüssel-ID an, die Sie im vorherigen Abschnitt erstellt haben.
Anforderungen von Apple für anonymisierte Daten einhalten
Mit „Mit Apple anmelden“ können Nutzer ihre Daten, einschließlich ihrer E‑Mail-Adresse, bei der Anmeldung anonymisieren. Nutzer, die diese Option auswählen, haben E‑Mail-Adressen mit der Domain privaterelay.appleid.com. Wenn Sie „Mit Apple anmelden“ in Ihrer App verwenden, müssen Sie alle geltenden Entwicklerrichtlinien oder ‑bedingungen von Apple bezüglich dieser anonymisierten Apple-IDs einhalten.
Dazu gehört auch, dass Sie die erforderliche Nutzereinwilligung einholen müssen, bevor Sie direkt identifizierbare personenbezogene Daten mit einer anonymisierten Apple-ID verknüpfen. Bei der Verwendung von Firebase Authentication können folgende Aktionen erforderlich sein:
- E‑Mail-Adresse mit einer anonymisierten Apple-ID verknüpfen und umgekehrt
- Telefonnummer mit einer anonymisierten Apple-ID verknüpfen und umgekehrt
- Nicht anonyme Anmeldedaten für soziale Medien (z. B. Facebook oder Google) mit einer anonymisierten Apple-ID verknüpfen und umgekehrt
Die obige Liste ist nicht vollständig. Beachten Sie die Lizenzvereinbarung des Apple Developer Program im Mitgliedschaftsbereich Ihres Entwicklerkontos, um sicherzustellen, dass Ihre App die Anforderungen von Apple erfüllt.
Anmeldevorgang mit dem Firebase SDK verarbeiten
Unter Android ist die einfachste Möglichkeit, Ihre Nutzer mit Firebase über ihre Apple-Konten zu authentifizieren, den gesamten Anmeldevorgang mit dem Firebase Android SDK zu verarbeiten.
So verarbeiten Sie den Anmeldevorgang mit dem Firebase Android SDK:
Erstellen Sie eine Instanz von
OAuthProvidermit dem Builder und der Anbieter-IDapple.com:Kotlin
val provider = OAuthProvider.newBuilder("apple.com")Java
OAuthProvider.Builder provider = OAuthProvider.newBuilder("apple.com");Optional:Geben Sie zusätzliche OAuth 2.0-Bereiche an, die Sie vom Authentifizierungsanbieter anfordern möchten.
Kotlin
provider.setScopes(arrayOf("email", "name"))Java
List<String> scopes = new ArrayList<String>() { { add("email"); add("name"); } }; provider.setScopes(scopes);Wenn Ein Konto pro E‑Mail-Adresse aktiviert ist, fordert Firebase standardmäßig die Bereiche „E‑Mail“ und „Name“ an. Wenn Sie diese Einstellung in Mehrere Konten pro E‑Mail-Adresse ändern, fordert Firebase keine Bereiche von Apple an es sei denn, Sie geben sie an.
Optional:Wenn Sie den Anmeldebildschirm von Apple in einer anderen Sprache als Englisch anzeigen möchten, legen Sie den Parameter
localefest. Informationen zu den unterstützten Gebietsschemas finden Sie in der Dokumentation zu „Mit Apple anmelden“.Kotlin
// Localize the Apple authentication screen in French. provider.addCustomParameter("locale", "fr")Java
// Localize the Apple authentication screen in French. provider.addCustomParameter("locale", "fr");Authentifizieren Sie sich mit Firebase über das OAuth-Anbieterobjekt. Beachten Sie, dass dieser Vorgang im Gegensatz zu anderen
FirebaseAuth-Vorgängen die Steuerung Ihrer UI übernimmt, indem ein benutzerdefinierter Chrome-Tab geöffnet wird. Verweisen Sie daher nicht in den ListenernOnSuccessListenerundOnFailureListenerauf Ihre Aktivität, da sie sofort getrennt werden, wenn der Vorgang die UI 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 sie während des Anmeldevorgangs vom System zurückgefordert werden kann. Damit der Nutzer in diesem Fall nicht noch einmal versuchen muss, sich anzumelden, sollten Sie prüfen, ob bereits ein Ergebnis vorhanden ist.
Rufen Sie
getPendingAuthResult()auf, um zu prüfen, ob ein ausstehendes Ergebnis vorhanden ist:Kotlin
val pending = auth.pendingAuthResult if (pending != null) { pending.addOnSuccessListener { authResult -> Log.d(TAG, "checkPending:onSuccess:$authResult") // Get the user profile with authResult.getUser() and // authResult.getAdditionalUserInfo(), and the ID // token from Apple with authResult.getCredential(). }.addOnFailureListener { e -> Log.w(TAG, "checkPending:onFailure", e) } } else { Log.d(TAG, "pending: null") }Java
mAuth = FirebaseAuth.getInstance(); Task<AuthResult> pending = mAuth.getPendingAuthResult(); if (pending != null) { pending.addOnSuccessListener(new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { Log.d(TAG, "checkPending:onSuccess:" + authResult); // Get the user profile with authResult.getUser() and // authResult.getAdditionalUserInfo(), and the ID // token from Apple with authResult.getCredential(). } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.w(TAG, "checkPending:onFailure", e); } }); } else { Log.d(TAG, "pending: null"); }Wenn kein ausstehendes Ergebnis vorhanden ist, starten Sie den Anmeldevorgang mit
startActivityForSignInWithProvider():Kotlin
auth.startActivityForSignInWithProvider(this, provider.build()) .addOnSuccessListener { authResult -> // Sign-in successful! Log.d(TAG, "activitySignIn:onSuccess:${authResult.user}") val user = authResult.user // ... } .addOnFailureListener { e -> Log.w(TAG, "activitySignIn:onFailure", e) }Java
mAuth.startActivityForSignInWithProvider(this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // Sign-in successful! Log.d(TAG, "activitySignIn:onSuccess:" + authResult.getUser()); FirebaseUser user = authResult.getUser(); // ... } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.w(TAG, "activitySignIn:onFailure", e); } });Anders als andere von Firebase Auth unterstützte Anbieter stellt Apple keine Foto-URL bereit.
Wenn der Nutzer seine E‑Mail-Adresse nicht mit der App teilen möchte, stellt Apple eine eindeutige E‑Mail-Adresse für diesen Nutzer bereit (im Format
xyz@privaterelay.appleid.com), die an Ihre App weitergegeben wird. Wenn Sie den privaten E‑Mail-Relay-Dienst konfiguriert haben, leitet Apple alle an die anonymisierte Adresse gesendeten E‑Mails an die reale E‑Mail-Adresse des Nutzers weiter.Apple gibt Nutzerinformationen wie den Anzeigenamen nur dann an Anwendungen weiter, wenn sich ein Nutzer zum ersten Mal anmeldet. Normalerweise speichert Firebase den Anzeigenamen, wenn sich ein Nutzer zum ersten Mal mit Apple anmeldet. Sie können ihn mit
getCurrentUser().getDisplayName()abrufen. Wenn Sie Apple jedoch zuvor verwendet haben, um einen Nutzer ohne Firebase in der App anzumelden, gibt Apple den Anzeigenamen des Nutzers nicht an Firebase weiter.
Erneute Authentifizierung und Kontoverknüpfung
Dasselbe Muster kann mit startActivityForReauthenticateWithProvider() verwendet werden. Damit können Sie neue Anmeldedaten für vertrauliche Vorgänge abrufen, für die eine aktuelle Anmeldung erforderlich ist:
Kotlin
// The user is already signed-in.
val firebaseUser = auth.getCurrentUser()
firebaseUser
.startActivityForReauthenticateWithProvider(/* activity= */ this, provider.build())
.addOnSuccessListener( 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( e -> {
// Handle failure.
})
Java
// The user is already signed-in.
FirebaseUser firebaseUser = mAuth.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.
}
});
Mit linkWithCredential() können Sie außerdem verschiedene Identitätsanbieter mit bestehenden Konten verknüpfen.
Apple setzt voraus, dass Sie die ausdrückliche Einwilligung der Nutzer einholen, bevor Sie ihre Apple-Konten mit anderen Daten verknüpfen.
Wenn Sie beispielsweise ein Facebook-Konto mit dem aktuellen Firebase-Konto verknüpfen möchten, verwenden Sie das Zugriffstoken, das Sie bei der Anmeldung des Nutzers bei Facebook erhalten haben:
Kotlin
// Initialize a Facebook credential with a Facebook access token.
val credential = FacebookAuthProvider.getCredential(token.getToken())
// Assuming the current user is an Apple user linking a Facebook provider.
mAuth.getCurrentUser().linkWithCredential(credential)
.addOnCompleteListener(this, task -> {
if (task.isSuccessful()) {
// Facebook credential is linked to the current Apple user.
// The user can now sign in to the same account
// with either Apple or Facebook.
}
});
Java
// Initialize a Facebook credential with a Facebook access token.
AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
// Assuming the current user is an Apple user linking a Facebook provider.
mAuth.getCurrentUser().linkWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// Facebook credential is linked to the current Apple user.
// The user can now sign in to the same account
// with either Apple or Facebook.
}
}
});
Fortgeschrittene Nutzer: Anmeldevorgang manuell verarbeiten
Sie können sich auch mit einem Apple-Konto bei Firebase authentifizieren, indem Sie den Anmeldevorgang entweder mit dem Apple Sign-In JS SDK verarbeiten, den OAuth-Ablauf manuell erstellen oder eine OAuth-Bibliothek wie AppAuth verwenden.
Generieren Sie für jede Anmeldeanfrage einen zufälligen String – eine „Nonce“ –, mit der Sie prüfen, ob das ID-Token, das Sie erhalten, speziell als Antwort auf die Authentifizierungsanfrage der Anwendung gewährt wurde. Dieser Schritt ist wichtig, um Wiederholungsangriffe zu verhindern.
Mit
SecureRandomkönnen Sie eine kryptografisch sichere Nonce unter Android generieren, wie im folgenden Beispiel gezeigt:Kotlin
private fun generateNonce(length: Int): String { val generator = SecureRandom() val charsetDecoder = StandardCharsets.US_ASCII.newDecoder() charsetDecoder.onUnmappableCharacter(CodingErrorAction.IGNORE) charsetDecoder.onMalformedInput(CodingErrorAction.IGNORE) val bytes = ByteArray(length) val inBuffer = ByteBuffer.wrap(bytes) val outBuffer = CharBuffer.allocate(length) while (outBuffer.hasRemaining()) { generator.nextBytes(bytes) inBuffer.rewind() charsetDecoder.reset() charsetDecoder.decode(inBuffer, outBuffer, false) } outBuffer.flip() return outBuffer.toString() }Java
private String generateNonce(int length) { SecureRandom generator = new SecureRandom(); CharsetDecoder charsetDecoder = StandardCharsets.US_ASCII.newDecoder(); charsetDecoder.onUnmappableCharacter(CodingErrorAction.IGNORE); charsetDecoder.onMalformedInput(CodingErrorAction.IGNORE); byte[] bytes = new byte[length]; ByteBuffer inBuffer = ByteBuffer.wrap(bytes); CharBuffer outBuffer = CharBuffer.allocate(length); while (outBuffer.hasRemaining()) { generator.nextBytes(bytes); inBuffer.rewind(); charsetDecoder.reset(); charsetDecoder.decode(inBuffer, outBuffer, false); } outBuffer.flip(); return outBuffer.toString(); }Rufen Sie dann den SHA256-Hash der Nonce als Hexadezimalstring ab:
Kotlin
private fun sha256(s: String): String { val md = MessageDigest.getInstance("SHA-256") val digest = md.digest(s.toByteArray()) val hash = StringBuilder() for (c in digest) { hash.append(String.format("%02x", c)) } return hash.toString() }Java
private String sha256(String s) throws NoSuchAlgorithmException { MessageDigest md = MessageDigest.getInstance("SHA-256"); byte[] digest = md.digest(s.getBytes()); StringBuilder hash = new StringBuilder(); for (byte c: digest) { hash.append(String.format("%02x", c)); } return hash.toString(); }Sie senden den SHA256-Hash der Nonce mit Ihrer Anmeldeanfrage, die Apple in der Antwort unverändert übergibt. Firebase validiert die Antwort, indem die ursprüngliche Nonce gehasht und mit dem von Apple übergebenen Wert verglichen wird.
Starten Sie den Anmeldevorgang von Apple mit Ihrer OAuth-Bibliothek oder einer anderen Methode. Fügen Sie der Anfrage unbedingt die gehashte Nonce als Parameter hinzu.
Nachdem Sie die Antwort von Apple erhalten haben, rufen Sie das ID-Token aus der Antwort ab und erstellen Sie damit und mit der ungehashten Nonce ein
AuthCredential:Kotlin
val credential = OAuthProvider.newCredentialBuilder("apple.com") .setIdTokenWithRawNonce(appleIdToken, rawUnhashedNonce) .build()Java
AuthCredential credential = OAuthProvider.newCredentialBuilder("apple.com") .setIdTokenWithRawNonce(appleIdToken, rawUnhashedNonce) .build();Authentifizieren Sie sich mit Firebase über die Firebase-Anmeldedaten:
Kotlin
auth.signInWithCredential(credential) .addOnCompleteListener(this) { task -> if (task.isSuccessful) { // User successfully signed in with Apple ID token. // ... } }Java
mAuth.signInWithCredential(credential) .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { // User successfully signed in with Apple ID token. // ... } } });
Wenn der Aufruf von signInWithCredential erfolgreich ist, können Sie mit der Methode getCurrentUser die Kontodaten des Nutzers abrufen.
Token widerrufen
Apple setzt voraus, dass Apps, die die Kontoerstellung unterstützen, Nutzern die Möglichkeit bieten müssen, das Initiieren des Löschens ihres Kontos innerhalb der App zu initiieren. Weitere Informationen finden Sie in den App Store-Überprüfungs richtlinien.
Außerdem sollten Apps, die „Mit Apple anmelden“ unterstützen, die REST API für „Mit Apple anmelden“ verwenden, um Nutzertokens zu widerrufen.
So erfüllen Sie diese Anforderung:
Verwenden Sie die Methode
startActivityForSignInWithProvider(), um sich mit Apple anzumelden undAuthResultabzurufen.Rufen Sie das Zugriffstoken für den Apple-Anbieter ab.
Kotlin
val oauthCredential: OAuthCredential = authResult.credential val accessToken = oauthCredential.accessTokenJava
OAuthCredential oauthCredential = (OAuthCredential) authResult.getCredential(); String accessToken = oauthCredential.getAccessToken();Widerrufen Sie das Token mit der
revokeAccessTokenAPI.Kotlin
mAuth.revokeAccessToken(accessToken) .addOnCompleteListener(this) { task -> if (task.isSuccessful) { // Access token successfully revoked // for the user ... } }Java
mAuth.revokeAccessToken(accessToken) .addOnCompleteListener(this, new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { // Access token successfully revoked // for the user ... } } });
- Löschen Sie schließlich das Nutzerkonto (und alle
zugehörigen Daten).
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 (Nutzername und Passwort, Telefonnummer oder Informationen zum Authentifizierungsanbieter). Dieses neue Konto wird als Teil Ihres Firebase-Projekts gespeichert und kann verwendet werden, um einen Nutzer in allen Apps Ihres Projekts zu identifizieren, unabhängig davon, wie sich der Nutzer anmeldet.
-
In Ihren Apps können Sie die grundlegenden Profilinformationen des Nutzers aus dem
FirebaseUserObjekt abrufen. Weitere Informationen finden Sie unter Nutzer verwalten. In den 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 die Anmeldung in Ihrer App mit mehreren Authentifizierungsanbietern ermöglichen, indem Sie Anmeldedaten für Authentifizierungsanbieter mit einem bestehenden Nutzerkonto verknüpfen.
Rufen Sie
signOutauf, um einen Nutzer abzumelden:Kotlin
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();
-