Catch up on everthing we announced at this year's Firebase Summit. Learn more

Authentifizieren mit Apple auf Android

Sie können Ihren Benutzern erlauben, sich mit ihrer Apple-ID bei Firebase zu authentifizieren, indem Sie das Firebase SDK verwenden, um den End-to-End-OAuth 2.0-Anmeldevorgang durchzuführen.

Bevor Sie beginnen

Um Benutzer mit Apple anzumelden, konfigurieren Sie zuerst "Mit Apple anmelden" auf der Entwickler-Site von Apple und aktivieren Sie dann Apple als Anmeldeanbieter für Ihr Firebase-Projekt.

Treten Sie dem Apple-Entwicklerprogramm bei

Einloggen mit Apple kann nur von Mitgliedern des so konfiguriert werden , von Apple Developer Program .

Anmeldung mit Apple konfigurieren

Auf der Apple Developer Website, gehen Sie wie folgt:

  1. Verknüpfen Sie Ihre Website zu Ihrer App , wie im ersten Abschnitt beschrieben konfigurieren Einloggen mit Apple für das Web . Registrieren Sie die folgende URL als Rückgabe-URL, wenn Sie dazu aufgefordert werden:

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

    Sie können Ihr Projekt Firebase - ID auf die bekommen Firebase Konsoleneinstellungen Seite .

    Wenn Sie fertig sind, notieren Sie sich Ihre neue Service-ID, die Sie im nächsten Abschnitt benötigen.

  2. Erstellen Sie ein Einloggen mit Apple privaten Schlüssel . Sie benötigen Ihren neuen privaten Schlüssel und Ihre Schlüssel-ID im nächsten Abschnitt.
  3. Wenn Sie eine beliebige Funktionen von Firebase - Authentifizierung ist , dass E - Mails an die Benutzer senden, einschließlich E - Mail - Link-Anmeldung, E - Mail - Adresse Überprüfung, Kontoänderung Widerruf und andere, configure das Apple private E - noreply@ YOUR_FIREBASE_PROJECT_ID .firebaseapp.com Mail - Relay - Dienst und registrieren noreply@ YOUR_FIREBASE_PROJECT_ID .firebaseapp.com (oder Ihre benutzerdefinierte E-Mail-Vorlagendomäne), damit Apple von Firebase Authentication gesendete E-Mails an anonymisierte Apple-E-Mail-Adressen weiterleiten kann.

Apple als Anmeldeanbieter aktivieren

  1. In Firebase zu dem Android - Projekt . Achten Sie darauf, die SHA-1-Signatur Ihrer App zu registrieren, wenn Sie Ihre App in der Firebase-Konsole einrichten.
  2. In der Firebase Konsole , öffnen Sie den Abschnitt Auth. Auf dem Anmelden Methode Registerkarte, aktivieren Sie den Apple - Provider. Geben Sie die Service-ID an, die Sie im vorherigen Abschnitt erstellt haben. Auch in der OAuth - Code Strömungskonfiguration Abschnitt geben Sie Ihre Apple - Team ID und der private Schlüssel und Schlüssel - ID Sie im vorherigen Abschnitt erstellt haben .

Erfülle die Anforderungen für anonymisierte Daten von Apple

Einloggen mit Apple gibt den Benutzern die Möglichkeit , ihre Daten zu anonymisieren, einschließlich ihrer E - Mail - Adresse, bei der Anmeldung. Benutzer , die diese Option wä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 in Bezug auf diese anonymisierten Apple-IDs einhalten.

Dazu gehört auch, die erforderliche Zustimmung des Benutzers einzuholen, bevor Sie direkt identifizierende personenbezogene Daten mit einer anonymisierten Apple-ID verknüpfen. Bei der Verwendung von Firebase Authentication kann dies die folgenden Aktionen umfassen:

  • Verknüpfen Sie eine E-Mail-Adresse mit einer anonymisierten Apple-ID oder umgekehrt.
  • Verknüpfen Sie eine Telefonnummer mit einer anonymisierten Apple-ID oder umgekehrt
  • Verknüpfen Sie einen nicht anonymen sozialen Zugang (Facebook, Google usw.) mit einer anonymisierten Apple-ID oder umgekehrt.

Die obige Liste ist nicht vollständig. Lesen Sie die Lizenzvereinbarung für das Apple-Entwicklerprogramm im Abschnitt „Mitgliedschaft“ Ihres Entwicklerkontos, um sicherzustellen, dass Ihre App die Anforderungen von Apple erfüllt.

Verwalten Sie den Anmeldevorgang mit dem Firebase SDK

Unter Android besteht die einfachste Möglichkeit zur Authentifizierung Ihrer Benutzer bei Firebase über ihre Apple-Konten darin, den gesamten Anmeldevorgang mit dem Firebase Android SDK abzuwickeln.

Gehen Sie wie folgt vor, um den Anmeldevorgang mit dem Firebase Android SDK durchzuführen:

  1. Konstruieren Sie eine Instanz eines OAuthProvider mit seinem Builder mit dem Provider ID apple.com :

    Java

    OAuthProvider.Builder provider = OAuthProvider.newBuilder("apple.com");
    

    Kotlin+KTX

    val provider = OAuthProvider.newBuilder("apple.com")
    
  2. Optional: Geben Sie zusätzliche OAuth 2.0 Bereiche jenseits der Standard , dass Sie auf Anfrage vom Authentifizierungs - Provider wollen.

    Java

    List<String> scopes =
        new ArrayList<String>() {
          {
            add("email");
            add("name");
          }
        };
    provider.setScopes(scopes);
    

    Kotlin+KTX

    provider.setScopes(arrayOf("email", "name"))
    

    Standardmäßig , wenn ein Konto pro E - Mail - Adresse aktiviert ist, fordert Firebase E - Mail und den Namen Bereiche. Wenn Sie diese Einstellung auf mehrere Konten pro E - Mail Adresse ändern, wird Firebase keine Bereiche von Apple anfordern , wenn Sie sie angeben.

  3. Optional: Wenn Sie Apples Anmeldebildschirm in einer anderen Sprache als Englisch angezeigt werden sollen, setzen Sie die locale - Parameter. Siehe die Anmeldung mit Apple - docs für die unterstützten Sprachen.

    Java

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

    Kotlin+KTX

    // Localize the Apple authentication screen in French.
    provider.addCustomParameter("locale", "fr")
    
  4. Authentifizieren Sie sich bei Firebase mithilfe des OAuth-Anbieterobjekts. Beachten Sie, dass im Gegensatz zu anderen FirebaseAuth Operationen, diese Kontrolle über Ihre UI nehmen durch einen Custom Chrome Tab öffnen. Folglich verweist nicht Ihre Aktivität im OnSuccessListener und OnFailureListener , dass Sie befestigen , da sie sofort ab , wenn der Betrieb die Benutzeroberfläche gestartet.

    Sie sollten zunächst prüfen, ob Sie bereits eine Antwort erhalten haben. Wenn Sie sich mit dieser Methode anmelden, wird Ihre Aktivität in den Hintergrund geschaltet, was bedeutet, dass sie während des Anmeldevorgangs vom System zurückgefordert werden kann. Um sicherzustellen, dass Sie den Benutzer in diesem Fall nicht erneut versuchen lassen, sollten Sie überprüfen, ob bereits ein Ergebnis vorliegt.

    Um zu überprüfen , ob es ein anstehendes Ergebnis ist, rufen getPendingAuthResult() :

    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");
    }
    

    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")
    }
    

    Wenn es kein anhängiges Ergebnis ist, starten Sie das Zeichen in Fluss, durch den Aufruf startActivityForSignInWithProvider() :

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

    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)
            }
    

    Im Gegensatz zu anderen von Firebase Auth unterstützten Anbietern stellt Apple keine Foto-URL bereit.

    Auch wenn der Benutzer wählt nicht ihre E - Mail mit der App von Apple Bestimmungen einer eindeutige E - Mail - Adresse für den Benutzer (der Form zu teilen xyz@privaterelay.appleid.com ), die es Aktien mit Ihrer App. Wenn Sie den privaten E-Mail-Relay-Dienst konfiguriert haben, leitet Apple an die anonymisierte Adresse gesendete E-Mails an die echte E-Mail-Adresse des Benutzers weiter.

    Apple - Aktien nur Benutzerinformationen wie dem Anzeigenamen mit Apps zum ersten Mal ein Benutzer in. In der Regel Firebase speichert der Anzeigename das erste Mal ein Benutzer mit Apple, die Sie mit bekommen getCurrentUser().getDisplayName() . Wenn Sie jedoch zuvor Apple verwendet haben, um einen Benutzer bei der App anzumelden, ohne Firebase zu verwenden, stellt Apple Firebase den Anzeigenamen des Benutzers nicht zur Verfügung.

Erneute Authentifizierung und Kontoverknüpfung

Das gleiche Muster kann mit verwendet werden startActivityForReauthenticateWithProvider() , die Sie einen neuen Anmeldeinformationen abrufen für sensible Vorgänge verwenden können , die kürzlich eine Anmeldung erforderlich:

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

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

Und, können Sie linkWithCredential() verschiedene Identity - Provider zu bestehenden Konten zu verknüpfen.

Beachten Sie, dass Sie bei Apple die ausdrückliche Zustimmung der Benutzer einholen müssen, bevor Sie deren Apple-Konten mit anderen Daten verknüpfen.

Um beispielsweise ein Facebook-Konto mit dem aktuellen Firebase-Konto zu verknüpfen, verwenden Sie das Zugriffstoken, das Sie von der Anmeldung des Benutzers bei Facebook erhalten haben:

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

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

Erweitert: Behandeln Sie den Anmeldevorgang manuell

Sie können auch durch den Umgang mit der Anmelde-Fluss entweder mit dem Apple - Sign-In JS SDK, manuell Bau den OAuth Flusses oder durch die Verwendung einer OAuth - Bibliothek wie mit Firebase unter Verwendung eines Apple Account authentifizieren AppAuth .

  1. Generieren Sie für jede Anmeldeanfrage eine zufällige Zeichenfolge – eine „Nonce“ –, die Sie verwenden werden, um sicherzustellen, dass das ID-Token, das Sie erhalten, speziell als Antwort auf die Authentifizierungsanfrage Ihrer App gewährt wurde. Dieser Schritt ist wichtig, um Replay-Angriffe zu verhindern.

    Sie können eine kryptografisch sicheren nonce auf Android mit erzeugen SecureRandom , wie im folgenden Beispiel:

    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();
    }
    

    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()
    }
    

    Holen Sie sich dann den SHA246-Hash der Nonce als Hex-String:

    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();
    }
    

    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()
    }
    

    Sie senden mit Ihrer Anmeldeanfrage den SHA256-Hash der Nonce, den Apple unverändert in der Antwort übergibt. Firebase validiert die Antwort durch Hashing der ursprünglichen Nonce und vergleicht sie mit dem von Apple übergebenen Wert.

  2. Starten Sie den Anmeldevorgang von Apple mit Ihrer OAuth-Bibliothek oder einer anderen Methode. Achten Sie darauf, die gehashte Nonce als Parameter in Ihre Anfrage aufzunehmen.

  3. Nachdem Sie Apples Antwort erhalten, bekommen die ID aus der Antwort - Token und es verwenden , und die ungehashte nonce zur Erstellung eines AuthCredential :

    Java

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

    Kotlin+KTX

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

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

    Kotlin+KTX

    auth.signInWithCredential(credential)
          .addOnCompleteListener(this) { task ->
              if (task.isSuccessful) {
                // User successfully signed in with Apple ID token.
                // ...
              }
          }
    

Wenn der Aufruf von signInWithCredential erfolgreich ist , können Sie die Verwendung getCurrentUser Methode des Benutzers Kontodaten zu erhalten.

Nächste Schritte

Nachdem sich ein Benutzer zum ersten Mal anmeldet, wird ein neues Benutzerkonto erstellt und mit den Anmeldeinformationen – d. h. Benutzername und Kennwort, Telefonnummer oder Authentifizierungsanbieterinformationen – verknüpft, mit denen sich der Benutzer angemeldet hat. Dieses neue Konto wird als Teil Ihres Firebase-Projekts gespeichert und kann verwendet werden, um einen Benutzer in jeder App in Ihrem Projekt zu identifizieren, unabhängig davon, wie sich der Benutzer anmeldet.

  • In Ihren Anwendungen können Sie die Benutzerprofilgrundinformationen aus dem bekommen FirebaseUser Objekt. Siehe Benutzer verwalten .

  • In Ihrer Datenbank und Firebase Realtime Cloud Storage Sicherheitsregeln , können Sie die angemeldeten Nutzer die eindeutige Benutzer - ID aus der bekommen auth Variable, und es verwenden , um steuern kann ein Benutzer Zugriff , welche Daten.

Sie können Benutzer erlauben , durch mehrere Authentifizierungsanbieter anmelden, um Ihre App Verknüpfung Auth - Provider - Anmeldeinformationen zu einem vorhandenen Benutzerkonto.

Um einen Benutzer abzumelden, rufen signOut :

Java

FirebaseAuth.getInstance().signOut();

Kotlin+KTX

Firebase.auth.signOut()