Mit Apple auf Android-Geräten authentifizieren

Sie können Ihre Nutzer mit ihrer Apple-ID bei Firebase authentifizieren, indem Sie den OAuth 2.0-Anmeldevorgang mit dem Firebase SDK abwickeln.

Hinweis

Damit du Nutzer über Apple anmelden kannst, musst du zuerst „Über Apple anmelden“ konfigurieren auf der Entwicklerwebsite von Apple ein und aktivieren Sie dann Apple als Anmeldeanbieter für Ihr Firebase-Projekt

Am Apple Developer Program teilnehmen

„Über Apple anmelden“ kann nur von Mitgliedern des Apple Developer Programm.

„Über Apple anmelden“ konfigurieren

Führen Sie auf der Website Apple Developer die folgenden Schritte aus:

  1. Verknüpfen Sie Ihre Website mit Ihrer App wie im ersten Abschnitt des Hilfeartikels Mit Apple im Web anmelden beschrieben. Registrieren Sie auf Aufforderung die folgende URL als Return-URL:

    https://YOUR_FIREBASE_PROJECT_ID.firebaseapp.com/__/auth/handler

    Sie finden Ihre Firebase-Projekt-ID auf der Firebase-Konsole auf der Seite „Einstellungen“.

    Notieren Sie sich zum Schluss die neue Dienst-ID, die Sie im nächsten Abschnitt benötigen.

  2. Erstellen Sie Mit privatem Apple-Schlüssel anmelden Sie benötigen Ihren neuen privaten Schlüssel und den neuen Schlüssel ID" ein.
  3. Wenn Sie eine der Funktionen von Firebase Authentication verwenden, über die E-Mails an Nutzer gesendet werden, z. B. die Anmeldung über einen E-Mail-Link, die Bestätigung der E-Mail-Adresse oder die Widerrufung von Kontoänderungen, konfigurieren Sie den privaten E-Mail-Relay-Dienst von Apple und registrieren Sie noreply@YOUR_FIREBASE_PROJECT_ID.firebaseapp.com (oder die Domain Ihrer benutzerdefinierten E-Mail-Vorlage), damit Apple von Firebase Authentication gesendete E-Mails an anonymisierte E-Mail-Adressen von Apple weiterleiten kann.

Apple als Anmeldeanbieter aktivieren

  1. Fügen Sie Ihrem Android-Projekt Firebase hinzu. Registrieren Sie die SHA-1-Signatur Ihrer App, wenn Sie sie in der Firebase-Konsole einrichten.
  2. Öffnen Sie in der Firebase Console den Bereich Auth. Gehen Sie auf dem Tab Anmeldemethode Aktivieren Sie den Apple-Anbieter. Geben Sie die Dienst-ID an, die Sie im vorherigen Abschnitt erstellt haben. Geben Sie außerdem im Abschnitt OAuth-Code-Flow-Konfiguration Ihre Apple-Team-ID sowie den privaten Schlüssel und die Schlüssel-ID an, die Sie im vorherigen Abschnitt erstellt haben.

Anforderungen an anonymisierte Daten von Apple erfüllen

Mit „Über Apple anmelden“ haben Nutzer die Möglichkeit, ihre Daten, einschließlich ihrer E-Mail-Adresse, bei der Anmeldung zu anonymisieren. Nutzer, die diese Option auswählen haben E-Mail-Adressen mit der Domain privaterelay.appleid.com. Wann? Sie die Funktion „Über Apple anmelden“ in Ihrer App verwenden, müssen Sie alle anwendbaren von Apple im Zusammenhang mit diesen anonymisierten IDs.

Dazu gehört auch, dass Sie alle erforderlichen Nutzereinwilligungen einholen, bevor Sie alle direkt identifizierbaren personenbezogenen Daten mit einem anonymisierten Apple ID. Bei der Verwendung der Firebase-Authentifizierung kann dies Folgendes umfassen:

  • E-Mail-Adresse mit einer anonymisierten Apple-ID verknüpfen und umgekehrt
  • Telefonnummer mit einer anonymisierten Apple-ID verknüpfen oder 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. Lesen Sie die Lizenzvereinbarung des Apple-Entwicklerprogramms im Bereich „Mitgliedschaft“ Ihres Entwicklerkontos, um sicherzustellen, dass Ihre App die Anforderungen von Apple erfüllt.

Anmeldevorgang mit dem Firebase SDK durchführen

Unter Android ist die einfachste Möglichkeit, Ihre Nutzer bei Firebase mithilfe ihres Apple-Konten übernimmt die gesamte Anmeldung mit der Firebase Android-App, SDK.

So führen Sie den Anmeldevorgang mit dem Firebase Android SDK aus:

  1. Erstellen Sie eine Instanz eines OAuthProvider mit dem Builder und der Anbieter-ID apple.com:

    Kotlin+KTX

    val provider = OAuthProvider.newBuilder("apple.com")
    

    Java

    OAuthProvider.Builder provider = OAuthProvider.newBuilder("apple.com");
    
  2. Optional: Geben Sie zusätzliche OAuth 2.0-Bereiche an, die über den standardmäßigen den Sie beim Authentifizierungsanbieter anfordern möchten.

    Kotlin+KTX

    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 einrichten, fordert Firebase keine Bereiche von Apple an es sei denn, Sie geben sie an.

  3. Optional: Wenn Sie den Anmeldebildschirm von Apple in einer anderen Sprache als Englisch anzeigen lassen möchten, legen Sie den Parameter locale fest. Eine Liste der unterstützten Sprachen finden Sie in der Dokumentation zu „Über Apple anmelden“.

    Kotlin+KTX

    // Localize the Apple authentication screen in French.
    provider.addCustomParameter("locale", "fr")
    

    Java

    // Localize the Apple authentication screen in French.
    provider.addCustomParameter("locale", "fr");
    
  4. Authentifizierung mit Firebase über das OAuth-Anbieterobjekt. Im Gegensatz zu anderen FirebaseAuth-Vorgängen wird dadurch die Kontrolle über die Benutzeroberfläche übernommen, indem ein benutzerdefinierter Chrome-Tab geöffnet wird. Verweisen Sie folglich nicht auf Ihre Aktivität in die angehängten OnSuccessListener und OnFailureListener, da sie sofort getrennt, wenn der Vorgang die UI startet.

    Prüfen Sie zuerst, ob Sie bereits eine Antwort erhalten haben. Bei der Anmeldung mit dieser Methode werden Ihre Aktivitäten im Hintergrund ausgeführt, was bedeutet, dass sie während des Anmeldevorgangs vom System zurückgerufen werden können. Damit der Nutzer nicht noch einmal versuchen muss, sollten Sie prüfen, ob ein Ergebnis bereits vorhanden ist.

    Wenn Sie prüfen möchten, ob ein ausstehendes Ergebnis vorliegt, rufen Sie getPendingAuthResult() auf:

    Kotlin+KTX

    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 Ergebnis vorhanden ist, starte den Anmeldevorgang, indem du startActivityForSignInWithProvider() aufrufst:

    Kotlin+KTX

    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 Apps weiter, wenn sich ein Nutzer zum ersten Mal anmeldet. Normalerweise wird der Anzeigename in Firebase gespeichert, wenn sich ein Nutzer zum ersten Mal bei Apple anmeldet. Sie können ihn mit getCurrentUser().getDisplayName() abrufen. Wenn Sie jedoch zuvor Apple verwendet haben, um einen Nutzer ohne Anmeldung in der App Bei Verwendung von Firebase stellt Apple Firebase das Display des Nutzers nicht zur Verfügung. Namen.

Neue Authentifizierung und Kontoverknüpfung

Dasselbe Muster kann mit startActivityForReauthenticateWithProvider() verwendet werden. mit denen Sie aktuelle Anmeldedaten für sensible Vorgänge abrufen können, kürzlich erfolgte Anmeldung erforderlich:

Kotlin+KTX

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

Außerdem können Sie mit linkWithCredential() verschiedene Identitätsanbieter mit vorhandenen Konten verknüpfen.

Apple verlangt, 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+KTX

// 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 entweder mit dem Apple Log-in JS SDK, OAuth-Ablauf oder mithilfe einer OAuth-Bibliothek wie AppAuth:

  1. Generieren Sie für jede Anmeldeanfrage einen zufälligen String: „Nonce“, mit dem Sie sicherstellen, dass das erhaltene ID-Token die speziell als Reaktion auf die Authentifizierungsanfrage Ihrer App gewährt werden. Dieser Schritt ist wichtig, um Wiederholungsversuche zu verhindern.

    Sie können eine kryptografisch sichere Nonce unter Android mit SecureRandom, wie im folgenden Beispiel:

    Kotlin+KTX

    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 SHA246-Hash der Nonce als Hexadezimalstring ab:

    Kotlin+KTX

    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.

  2. Starte den Anmeldevorgang von Apple mit deiner OAuth-Bibliothek oder einer anderen Methode. Geben Sie den gehashten Nonce als Parameter in Ihrer Anfrage an.

  3. Nachdem Sie die Antwort von Apple erhalten haben, rufen Sie das ID-Token aus der Antwort ab und verwenden Sie es zusammen mit dem nicht gehashten Nonce, um eine AuthCredential zu erstellen:

    Kotlin+KTX

    val credential =  OAuthProvider.newCredentialBuilder("apple.com")
        .setIdTokenWithRawNonce(appleIdToken, rawUnhashedNonce)
        .build()
    

    Java

    AuthCredential credential =  OAuthProvider.newCredentialBuilder("apple.com")
        .setIdTokenWithRawNonce(appleIdToken, rawUnhashedNonce)
        .build();
    
  4. Authentifizieren Sie sich mit den Firebase-Anmeldedaten bei Firebase:

    Kotlin+KTX

    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 die getCurrentUser verwenden. um die Kontodaten des Nutzers abzurufen.

Token widerrufen

Apple verlangt, dass Nutzer in Apps, die die Kontoerstellung unterstützen, Löschen ihres Kontos innerhalb der App, wie im Artikel App Store Review (App Store-Rezension) beschrieben Richtlinien

Außerdem sollten Apps, die „Über Apple anmelden“ unterstützen, die Funktion „Über Apple anmelden“ verwenden. REST API zum Widerrufen von Nutzertokens.

Führen Sie die folgenden Schritte aus, um diese Anforderung zu erfüllen:

  1. Melde dich mit der Methode startActivityForSignInWithProvider() über Apple an und erhalte AuthResult.

  2. Rufe das Zugriffstoken für den Apple-Anbieter ab.

    Kotlin+KTX

    val oauthCredential: OAuthCredential =  authResult.credential
    val accessToken = oauthCredential.accessToken
    

    Java

    OAuthCredential oauthCredential = (OAuthCredential) authResult.getCredential();
    String accessToken = oauthCredential.getAccessToken();
    
  3. Widerrufe das Token mit der revokeAccessToken API.

    Kotlin+KTX

    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 ...
              }
            }
      });
    
  1. Löschen Sie abschließend das Nutzerkonto und alle zugehörigen Daten.

    Nächste Schritte

    Nachdem sich ein Nutzer zum ersten Mal angemeldet hat, wird ein neues Nutzerkonto erstellt und die mit den Anmeldedaten verknüpft sind, d. h. Nutzername und Passwort, oder Authentifizierungsanbieter-Informationen – also für den Nutzer, mit dem sich der Nutzer angemeldet hat. Diese neue -Konto wird als Teil Ihres Firebase-Projekts gespeichert und kann verwendet werden, um in jeder App in Ihrem Projekt einen Nutzer erreichen, unabhängig davon, wie er sich anmeldet.

    • Die grundlegenden Profilinformationen der Nutzer finden Sie in Ihren Apps über die FirebaseUser-Objekt. Weitere Informationen finden Sie unter . Nutzer verwalten.

    • In Firebase Realtime Database und Cloud Storage Sicherheitsregeln können Sie die eindeutige Nutzer-ID des angemeldeten Nutzers aus der Variablen auth abrufen, und steuern, auf welche Daten ein Nutzer zugreifen kann.

    Sie können Nutzern erlauben, sich über mehrere Authentifizierungsanbieter in Ihrer App anzumelden, indem Sie Anmeldedaten des Authentifizierungsanbieters mit einem vorhandenen Nutzerkonto verknüpfen.

    Wenn Sie einen Nutzer abmelden möchten, rufen Sie signOut auf:

    Kotlin+KTX

    Firebase.auth.signOut()

    Java

    FirebaseAuth.getInstance().signOut();