S'authentifier à l'aide des services de jeux Google Play sur Android

Vous pouvez utiliser les services de jeux Google Play pour connecter des joueurs à un jeu Android créé sur Firebase. Pour utiliser la connexion aux services de jeux Google Play avec Firebase, connectez d'abord le joueur avec les services de jeux Google Play, puis demandez un code d'authentification OAuth 2.0. Ensuite, transmettez le code d'authentification à PlayGamesAuthProvider pour générer des identifiants Firebase, que vous pourrez utiliser pour vous authentifier auprès de Firebase.

Avant de commencer

Configurer votre projet Android

  1. Si ce n'est pas déjà fait, ajoutez Firebase à votre projet Android.

  2. Dans le fichier Gradle de votre module (au niveau de l'application) (généralement <project>/<app-module>/build.gradle.kts ou <project>/<app-module>/build.gradle), ajoutez la dépendance pour la bibliothèque Firebase Authentication pour Android. Nous vous recommandons d'utiliser la Firebase Android BoM pour contrôler la gestion des versions de la bibliothèque.

    De plus, lors de la configuration de Firebase Authentication, vous devez ajouter le SDK des services Google Play à votre application.

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

    En utilisant les Firebase Android BoM, votre application utilisera toujours des versions compatibles des bibliothèques Firebase Android.

    (Autre solution)  Ajouter des dépendances de bibliothèque Firebase sans utiliser la BoM

    Si vous choisissez de ne pas utiliser la Firebase BoM, vous devez spécifier chaque version de la bibliothèque Firebase dans sa ligne de dépendance.

    Notez que si vous utilisez plusieurs bibliothèques Firebase dans votre application, nous vous recommandons vivement d'utiliser la BoM pour gérer les versions des bibliothèques, ce qui garantit que toutes les versions sont compatibles.

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

Configurer votre projet Firebase

  1. Définissez l'empreinte SHA-1 de votre jeu à partir de la page "Settings" de la console Firebase.

    Vous pouvez obtenir le hachage SHA de votre certificat de signature avec la commande gradle signingReport :

    ./gradlew signingReport

  2. Activez les services de jeux Google Play en tant que fournisseur de connexion :

    1. Recherchez l'ID client et le code secret du client de votre serveur Web. L'ID client du serveur Web identifie votre projet Firebase auprès des serveurs d'authentification Google Play.

      Pour trouver ces valeurs, procédez comme suit :

      1. Ouvrez votre projet Firebase sur la page des identifiants de la console Google APIs.
      2. Dans la section OAuth 2.0 client IDs (ID client OAuth 2.0), ouvrez la page de détails Web client (auto created by Google Service) (Client Web (créé automatiquement par le service Google)). Cette page liste l'ID client et le code secret de votre serveur Web.
    2. Ensuite, dans la console Firebase, ouvrez la section Authentication (Authentification).

    3. Dans l'onglet Sign in method (Méthode de connexion), activez le fournisseur de connexion Play Games (Jeux Play). Vous devrez spécifier l'ID client et le code secret du client de votre serveur Web, que vous avez obtenus dans la console APIs.

Configurer Play Games services avec les informations de votre application Firebase

  1. Dans la Google Play Console, ouvrez votre Google Play application ou créez-en une.

  2. Dans la section Grow (Développement), cliquez sur Play Games services > Configuration et gestion > Configuration.

  3. Cliquez sur Yes, my game already uses Google APIs (Oui, mon jeu utilise déjà des API Google), sélectionnez votre projet Firebase dans la liste, puis cliquez sur Use (Utiliser).

  4. Sur la page de configuration Play Games services, cliquez sur Add Credential (Ajouter des identifiants).

    1. Sélectionnez le type Game server (Serveur de jeux).
    2. Dans le champ OAuth client (Client OAuth), sélectionnez l'ID client Web de votre projet. Assurez-vous qu'il s'agit du même ID client que celui que vous avez spécifié lorsque vous avez activé Play Games la connexion.
    3. Enregistrez les modifications.
  5. Toujours sur la page de configuration Play Games services, cliquez Add Credential à nouveau.

    1. Sélectionnez le type Android.
    2. Dans le champ OAuth client (Client OAuth), sélectionnez l'ID client Android de votre projet. (Si vous ne voyez pas votre ID client Android, assurez-vous d'avoir défini l'empreinte SHA-1 de votre jeu dans la console Firebase.)
    3. Enregistrez les modifications.
  6. Sur la page Testers (Testeurs), ajoutez les adresses e-mail des utilisateurs qui doivent pouvoir se connecter à votre jeu avant sa publication sur le Play Store.

Intégrer la connexion aux services de jeux Play à votre jeu

Commencez par intégrer la connexion aux services de jeux Play à votre application. Pour obtenir des instructions complètes, consultez Se connecter aux jeux Android.

Dans votre intégration, lorsque vous créez l'objet GoogleSignInOptions, utilisez la configuration DEFAULT_GAMES_SIGN_IN et appelez 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();

Vous devez transmettre l'ID client de votre serveur Web à la méthode requestServerAuthCode. Il s'agit de l'ID que vous avez fourni lorsque vous avez activé la connexion aux services de jeux Play dans la Firebase console.

S'authentifier auprès de Firebase

Après avoir ajouté la connexion aux services de jeux Play à votre application, vous devez configurer Firebase pour qu'il utilise les identifiants de compte Google que vous obtenez lorsqu'un joueur se connecte avec succès aux services de jeux Play.

  1. Tout d'abord, dans la méthode onCreate de l'activité de connexion, obtenez l'instance partagée de l'objet FirebaseAuth :

Kotlin

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

Java

private FirebaseAuth mAuth;
// ...
// Initialize Firebase Auth
mAuth = FirebaseAuth.getInstance();
  1. Lors de l'initialisation de votre activité, vérifiez si le joueur est déjà connecté à 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. Une fois qu'un joueur s'est connecté aux services de jeux Play de manière silencieuse ou interactive, obtenez le code d'authentification à partir de l'objet GoogleSignInAccount, échangez-le contre des identifiants Firebase et authentifiez-vous auprès de Firebase à l'aide de ces identifiants :

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

                    // ...
                }
            });
}

Si l'appel à signInWithCredential réussit, vous pouvez utiliser la méthode getCurrentUser pour obtenir les données de compte de l'utilisateur.

Étapes suivantes

Lorsqu'un utilisateur se connecte pour la première fois, un compte utilisateur est créé et associé à son ID de services de jeux Play. Ce nouveau compte est stocké dans votre projet Firebase et peut être utilisé pour identifier un utilisateur dans toutes les applications de votre projet.

Dans votre jeu, vous pouvez obtenir l'UID Firebase de l'utilisateur à partir de l'objet 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();

Dans les règles de sécurité de votre Firebase Realtime Database et de Cloud Storage, vous pouvez obtenir l'ID utilisateur unique de l'utilisateur connecté à partir de la variable auth et l'utiliser pour contrôler les données auxquelles un utilisateur peut accéder.

Pour obtenir les informations du joueur des services de jeux Play ou pour accéder aux services de jeux Play, utilisez les API fournies par le SDK des services de jeux Google Play.

Pour déconnecter un utilisateur, appelez FirebaseAuth.signOut() :

Kotlin

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();