Autentica con i servizi per i giochi di Google Play su Android

Puoi utilizzare i servizi per i giochi di Google Play per consentire ai giocatori di accedere a un gioco per Android creato su Firebase. Per utilizzare l'accesso ai servizi per i giochi di Google Play con Firebase, accedi prima con Google Play Games e richiedi un codice di autenticazione OAuth 2.0 quando lo fai. Quindi, passa il codice di autenticazione a PlayGamesAuthProvider per generare una credenziale Firebase, che puoi utilizzare per l'autenticazione con Firebase.

Prima di iniziare

Configurare il progetto Android

  1. Se non l'hai ancora fatto, aggiungi Firebase al tuo progetto Android.

  2. Nel file Gradle (a livello di app) del modulo (di solito <project>/<app-module>/build.gradle.kts o <project>/<app-module>/build.gradle), aggiungi la dipendenza per la libreria Firebase Authentication per Android. Ti consigliamo di utilizzare Firebase Android BoM per controllare il controllo delle versioni della libreria.

    Inoltre, nell'ambito della configurazione di Firebase Authentication, devi aggiungere l'SDK Google Play Services alla tua app.

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:34.0.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.3.0")
    }

    Utilizzando la Firebase Android BoM, la tua app utilizzerà sempre versioni compatibili delle librerie Firebase Android.

    (Alternativa)  Aggiungi le dipendenze della libreria Firebase senza utilizzare BoM

    Se scegli di non utilizzare la Firebase BoM, devi specificare ogni versione della libreria Firebase nella riga della dipendenza.

    Tieni presente che se utilizzi più librerie Firebase nella tua app, ti consigliamo vivamente di utilizzare la BoM per gestire le versioni delle librerie, in modo da garantire la compatibilità di tutte le versioni.

    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.0.0")
    // Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:21.3.0")
    }

Configura il progetto Firebase

  1. Imposta l'impronta SHA-1 del gioco dalla pagina Impostazioni della console Firebase.

    Puoi ottenere l'hash SHA del certificato di firma con il comando gradle signingReport:

    ./gradlew signingReport

  2. Attiva Google Play Giochi come provider di accesso:

    1. Trova l'ID client e il client secret del server web del tuo progetto. L'ID client del server web identifica il tuo progetto Firebase nei server di autenticazione di Google Play.

      Per trovare questi valori:

      1. Apri il progetto Firebase nella pagina delle credenziali della console API di Google.
      2. Nella sezione ID client OAuth 2.0, apri la pagina dei dettagli del client web (creato automaticamente dal servizio Google). Questa pagina elenca l'ID client e il secret del server web.
    2. Poi, nella console Firebase, apri la sezione Autenticazione.

    3. Nella scheda Metodo di accesso, attiva il provider di accesso Play Giochi. Dovrai specificare l'ID client e il client secret del server web del tuo progetto, che hai ottenuto dalla console API.

Configura Play Games services con le informazioni della tua app Firebase

  1. Nella console Google Play, apri l'app Google Play o creane una.

  2. Nella sezione Crescita, fai clic su Play Games services > Configurazione e gestione > Configurazione.

  3. Fai clic su Sì, il mio gioco utilizza già API di Google, seleziona il tuo progetto Firebase dall'elenco e poi fai clic su Usa.

  4. Nella pagina di configurazione di Play Games services, fai clic su Aggiungi credenziale.

    1. Seleziona il tipo Server di gioco.
    2. Nel campo Client OAuth, seleziona l'ID client web del tuo progetto. Assicurati che sia lo stesso ID client specificato quando hai attivato l'accesso Play Games.
    3. Salva le modifiche.
  5. Ancora nella pagina di configurazione di Play Games services, fai clic su Aggiungi credenziale.

    1. Seleziona il tipo Android.
    2. Nel campo Client OAuth, seleziona l'ID client Android del tuo progetto. Se non vedi l'ID client Android, assicurati di impostare l'impronta SHA-1 del gioco nella console Firebase.
    3. Salva le modifiche.
  6. Nella pagina Tester, aggiungi gli indirizzi email di tutti gli utenti che devono poter accedere al tuo gioco prima che venga rilasciato su Play Store.

Integrare l'accesso a Play Giochi nel tuo gioco

Innanzitutto, integra l'accesso a Play Giochi nella tua app. Per istruzioni complete, consulta la sezione Accedere a Google Play Giochi per Android.

Nella tua integrazione, quando crei l'oggetto GoogleSignInOptions, utilizza la configurazione DEFAULT_GAMES_SIGN_IN e chiama requestServerAuthCode:

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

Devi trasmettere l'ID client del server web al metodo requestServerAuthCode. Questo è l'ID che hai fornito quando hai attivato l'accesso a Play Giochi nella console Firebase.

Autenticarsi con Firebase

Dopo aver aggiunto l'accesso a Play Giochi alla tua app, devi configurare Firebase per utilizzare le credenziali dell'Account Google che ottieni quando un giocatore accede correttamente con Play Giochi.

  1. Innanzitutto, nel metodo onCreate dell'attività di accesso, recupera l'istanza condivisa dell'oggetto FirebaseAuth:

Kotlin

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

Java

private FirebaseAuth mAuth;
// ...
// Initialize Firebase Auth
mAuth = FirebaseAuth.getInstance();
  1. Quando inizializzi l'attività, controlla se il giocatore ha già eseguito l'accesso con Firebase:

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);
}
If the player isn't signed in, present the player with your game's
signed-out experience, including the option to sign in.
  1. Dopo che un giocatore ha eseguito l'accesso con Play Giochi in modo silenzioso o interattivo, recupera il codice di autorizzazione dall'oggetto GoogleSignInAccount, scambialo con una credenziale Firebase e autenticati con Firebase utilizzando la credenziale 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);
                    }

                    // ...
                }
            });
}

Se la chiamata a signInWithCredential va a buon fine, puoi utilizzare il metodo getCurrentUser per ottenere i dati dell'account dell'utente.

Passaggi successivi

Dopo che un utente ha eseguito l'accesso per la prima volta, viene creato un nuovo account utente collegato al suo ID giocatore Play Giochi. Questo nuovo account viene memorizzato come parte del tuo progetto Firebase e può essere utilizzato per identificare un utente in ogni app del tuo progetto.

Nel tuo gioco, puoi ottenere l'UID Firebase dell'utente dall'oggetto FirebaseUser:

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

Nelle regole di sicurezza di Firebase Realtime Database e Cloud Storage, puoi ottenere l'ID utente univoco dell'utente che ha eseguito l'accesso dalla variabile auth e utilizzarlo per controllare a quali dati può accedere un utente.

Per ottenere le informazioni sul giocatore di Play Giochi di un utente o per accedere ai servizi per i giochi di Play, utilizza le API fornite dall'SDK Google Play Games.

Per disconnettere un utente, chiama FirebaseAuth.signOut():

Kotlin

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();