Mit den Google Play-Spieldiensten auf Android-Geräten authentifizieren

Mit den Google Play Games-Diensten können sich Spieler in einem Android-Spiel anmelden, das auf Firebase basiert. Wenn du die Anmeldung über die Google Play Games-Dienste mit Firebase verwenden möchtest, melde den Spieler zuerst bei Google Play Games an und fordere dabei einen OAuth 2.0-Autorisierungscode an. Übergebe den Autorisierungscode dann an PlayGamesAuthProvider, um Anmeldedaten für Firebase zu generieren, mit denen du dich bei Firebase authentifizieren kannst.

Hinweis

Android-Projekt einrichten

  1. Falls noch nicht geschehen, füge deinem Android-Projekt Firebase hinzu.

  2. Füge in der Gradle-Datei des Moduls (auf Anwendungsebene) (in der Regel <project>/<app-module>/build.gradle.kts oder <project>/<app-module>/build.gradle) die Abhängigkeit für die Firebase Authentication Bibliothek für Android hinzu. Wir empfehlen, die Firebase Android BoM zu verwenden, um die Bibliotheksversionierung zu steuern.

    Außerdem musst du im Rahmen der Einrichtung von Firebase Authentication das Google Play-Dienste SDK zu deiner App hinzufügen.

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:34.15.0"))
    
        // Add the dependency for the Firebase Authentication library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth")
    // Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:21.6.0")
    }

    Mit der Firebase Android BoM, hast du immer eine kompatible Version der Firebase Android-Bibliotheken in deiner App.

    (Alternative)   Firebase-Bibliotheksabhängigkeiten ohne Verwendung der BoM

    Wenn du die Firebase BoM nicht verwenden möchtest, musst du die Version jeder Firebase-Bibliothek in der entsprechenden Abhängigkeitszeile angeben.

    Wenn du in deiner App mehrere Firebase-Bibliotheken verwendest, empfehlen wir dringend, die BoM zu verwenden, um die Bibliotheksversionen zu verwalten. So wird sichergestellt, dass alle Versionen kompatibel sind.

    dependencies {
        // Add the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth:24.1.0")
    // Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:21.6.0")
    }

Das Firebase-Projekt einrichten

  1. Rufe in der Firebase Console Security > Authentication auf.

  2. Lege auf dem Tab Einstellungen den SHA-1-Fingerabdruck deines Spiels fest.

    Du kannst den SHA-Hash deines Signaturzertifikats mit dem Gradle-Befehl signingReport abrufen:

    ./gradlew signingReport

  3. Aktiviere Google Play Games als Anmeldeanbieter:

    1. Suche die Webserver-Client-ID und den Clientschlüssel deines Projekts. Die Webserver-Client-ID identifiziert dein Firebase-Projekt auf den Google Play-Authentifizierungsservern.

      So ermittelst du diese Werte:

      1. Öffne dein Firebase-Projekt auf der Seite Anmeldedaten der Google APIs Console.
      2. Öffne im Bereich OAuth 2.0-Client-IDs die Detailseite Webclient (von Google-Dienst automatisch erstellt). Auf dieser Seite sind die Webserver-Client-ID und der Clientschlüssel aufgeführt.
    2. Kehre zur Firebase Console zurück und rufe Security > Authentication auf.

    3. Aktiviere auf dem Tab Anmeldemethode den Anmeldeanbieter Play Games. Du musst die Webserver-Client-ID und den Clientschlüssel deines Projekts angeben, die du in der APIs Console abgerufen hast.

Play Games services mit den Informationen deiner Firebase-App konfigurieren

  1. Öffne in der Google Play Console, deine Google Play App oder erstelle eine.

  2. Klicke im Bereich Wachstum auf Play Games services > Einrichtung und Verwaltung &gt; Konfiguration.

  3. Klicke auf Ja, in meinem Spiel kommen bereits Google-APIs zum Einsatz, wähle dein Firebase Projekt aus der Liste aus und klicke dann auf Verwenden.

  4. Klicke auf der Play Games services Konfigurationsseite auf Anmeldedaten hinzufügen.

    1. Wähle den Typ Game-Server aus.
    2. Wähle im Feld OAuth-Client die Webclient-ID deines Projekts aus. Achte darauf, dass dies dieselbe Client-ID ist, die du beim Aktivieren der Play Games Anmeldung angegeben hast.
    3. Speichere die Änderungen.
  5. Klicke noch einmal auf der Play Games services Konfigurationsseite auf Anmeldedaten hinzufügen.

    1. Wähle den Typ Android aus.
    2. Wähle im Feld OAuth-Client die Android-Client-ID deines Projekts aus. Wenn du deine Android-Client-ID nicht siehst, musst du den SHA-1-Fingerabdruck deines Spiels in der Firebase Console festlegen.
    3. Speichere die Änderungen.
  6. Füge auf der Seite Tester die E-Mail-Adressen aller Nutzer hinzu, die sich in deinem Spiel anmelden können müssen, bevor du es im Play Store veröffentlichst.

Anmeldung über Play Games in dein Spiel einbinden

Binde zuerst die Anmeldung über Play Games in deine App ein. Eine vollständige Anleitung findest du unter In Android-Spielen anmelden.

Verwende bei der Erstellung des GoogleSignInOptions-Objekts in deiner Integration die Konfiguration DEFAULT_GAMES_SIGN_IN und rufe requestServerAuthCode auf:

Kotlin

val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
    .requestServerAuthCode(getString(R.string.default_web_client_id))
    .build()

Java

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
        .requestServerAuthCode(getString(R.string.default_web_client_id))
        .build();

Du musst die Webserver-Client-ID an die Methode requestServerAuthCode übergeben. Das ist die ID, die du beim Aktivieren der Anmeldung über Play Games in der Firebase Console angegeben hast.

Mit Firebase authentifizieren

Nachdem du die Anmeldung über Play Games zu deiner App hinzugefügt hast, musst du Firebase so einrichten, dass die Google-Kontodaten verwendet werden, die du erhältst, wenn sich ein Spieler erfolgreich über Play Games anmeldet.

  1. Rufe zuerst in der Methode onCreate deiner Anmeldeaktivität die freigegebene Instanz des Objekts FirebaseAuth ab:

    Kotlin

    private lateinit var auth: FirebaseAuth
    // ...
    // Initialize Firebase Auth
    auth = Firebase.auth

    Java

    private FirebaseAuth mAuth;
    // ...
    // Initialize Firebase Auth
    mAuth = FirebaseAuth.getInstance();
  2. Prüfe beim Initialisieren deiner Aktivität, ob der Spieler bereits bei Firebase angemeldet ist:

    Kotlin

    override fun onStart() {
        super.onStart()
        // Check if user is signed in (non-null) and update UI accordingly.
        val currentUser = auth.currentUser
        updateUI(currentUser)
    }

    Java

    @Override
    public void onStart() {
        super.onStart();
        // Check if user is signed in (non-null) and update UI accordingly.
        FirebaseUser currentUser = mAuth.getCurrentUser();
        updateUI(currentUser);
    }

    Wenn der Spieler nicht angemeldet ist, zeige ihm die Abmeldungsoberfläche deines Spiels an, einschließlich der Option zur Anmeldung.

  3. Nachdem sich ein Spieler entweder im Hintergrund oder interaktiv über Play Games angemeldet hat, rufe den Autorisierungscode aus dem Objekt GoogleSignInAccount ab, tausche ihn gegen Anmeldedaten für Firebase ein und authentifiziere dich mit den Firebase-Anmeldedaten bei Firebase:

    Kotlin

    // Call this both in the silent sign-in task's OnCompleteListener and in the
    // Activity's onActivityResult handler.
    private fun firebaseAuthWithPlayGames(acct: GoogleSignInAccount) {
        Log.d(TAG, "firebaseAuthWithPlayGames:" + acct.id!!)
    
        val auth = Firebase.auth
        val credential = PlayGamesAuthProvider.getCredential(acct.serverAuthCode!!)
        auth.signInWithCredential(credential)
            .addOnCompleteListener(this) { task ->
                if (task.isSuccessful) {
                    // Sign in success, update UI with the signed-in user's information
                    Log.d(TAG, "signInWithCredential:success")
                    val user = auth.currentUser
                    updateUI(user)
                } else {
                    // If sign in fails, display a message to the user.
                    Log.w(TAG, "signInWithCredential:failure", task.exception)
                    Toast.makeText(
                        baseContext,
                        "Authentication failed.",
                        Toast.LENGTH_SHORT,
                    ).show()
                    updateUI(null)
                }
    
                // ...
            }
    }

    Java

    // Call this both in the silent sign-in task's OnCompleteListener and in the
    // Activity's onActivityResult handler.
    private void firebaseAuthWithPlayGames(GoogleSignInAccount acct) {
        Log.d(TAG, "firebaseAuthWithPlayGames:" + acct.getId());
    
        final FirebaseAuth auth = FirebaseAuth.getInstance();
        AuthCredential credential = PlayGamesAuthProvider.getCredential(acct.getServerAuthCode());
        auth.signInWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            // Sign in success, update UI with the signed-in user's information
                            Log.d(TAG, "signInWithCredential:success");
                            FirebaseUser user = auth.getCurrentUser();
                            updateUI(user);
                        } else {
                            // If sign in fails, display a message to the user.
                            Log.w(TAG, "signInWithCredential:failure", task.getException());
                            Toast.makeText(MainActivity.this, "Authentication failed.",
                                    Toast.LENGTH_SHORT).show();
                            updateUI(null);
                        }
    
                        // ...
                    }
                });
    }

    Wenn der Aufruf von signInWithCredential erfolgreich ist, kannst du mit der Methode getCurrentUser die Kontodaten des Nutzers abrufen.

Nächste Schritte

Wenn sich ein Nutzer zum ersten Mal anmeldet, wird ein neues Nutzerkonto erstellt und mit seiner Play Games-ID verknüpft. Dieses neue Konto wird als Teil deines Firebase-Projekts gespeichert und kann verwendet werden, um einen Nutzer in allen Apps deines Projekts zu identifizieren.

In deinem Spiel kannst du die Firebase-UID des Nutzers aus dem Objekt FirebaseUser abrufen:

Kotlin

val user = auth.currentUser
user?.let {
    val playerName = it.displayName

    // The user's Id, unique to the Firebase project.
    // Do NOT use this value to authenticate with your backend server, if you
    // have one; use FirebaseUser.getIdToken() instead.
    val uid = it.uid
}

Java

FirebaseUser user = mAuth.getCurrentUser();
String playerName = user.getDisplayName();

// The user's Id, unique to the Firebase project.
// Do NOT use this value to authenticate with your backend server, if you
// have one; use FirebaseUser.getIdToken() instead.
String uid = user.getUid();

In den Sicherheitsregeln für die Firebase Realtime Database und Cloud Storage kannst du die eindeutige Nutzer-ID des angemeldeten Nutzers aus der Variablen auth abrufen und damit steuern, auf welche Daten ein Nutzer zugreifen kann.

Wenn du die Play Games-Spielerinformationen eines Nutzers abrufen oder auf die Play Games-Dienste zugreifen möchtest, verwende die APIs, die vom Google Play Games SDK bereitgestellt werden.

Rufe FirebaseAuth.signOut() auf, um einen Nutzer abzumelden:

Kotlin

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();