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

Vous pouvez utiliser les services de jeux Google Play pour connecter les joueurs à un jeu Android basé sur Firebase. Pour utiliser la connexion aux services de jeux Google Play avec Firebase : connecter le joueur avec Google Play Jeux, puis demander une authentification OAuth 2.0 du code. Transmettez ensuite le code d'autorisation à 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 Firebase Android BoM pour contrôler la gestion des versions des bibliothèques.

    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:33.2.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.2.0")
    }

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

    (Alternative) Ajouter des dépendances de la bibliothèque Firebase sans utiliser l'BoM

    Si vous choisissez de ne pas utiliser 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, recommandent d'utiliser BoM pour gérer les versions de la bibliothèque, 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:23.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.2.0")
    }
    Vous recherchez un module de bibliothèque spécifique à Kotlin ? Début dans Octobre 2023 (Firebase BoM 32.5.0), les développeurs Kotlin et Java peuvent dépendent du module de bibliothèque principal (pour en savoir plus, consultez Questions fréquentes sur cette initiative).

Configurer votre projet Firebase

  1. Définissez l'empreinte SHA-1 de votre jeu sur la page Settings (Paramètres) de la console Firebase.

    Vous pouvez obtenir le hachage SHA de votre certificat de signature avec l'outil Gradle Commande signingReport:

    ./gradlew signingReport

  2. Activer Google Play Jeux comme fournisseur de connexion:

    1. Recherchez l'ID client du serveur Web et le code secret du client associés à votre projet. Le Web l'ID client du serveur identifie votre projet Firebase dans le serveurs d'authentification.

      Pour trouver ces valeurs, procédez comme suit :

      1. Ouvrez votre projet Firebase sur la page des identifiants de la console des API Google.
      2. Dans la section ID client OAuth 2.0, ouvrez la page d'informations sur le client Web (créé automatiquement par le service Google). Cette page liste l'ID client et le secret de votre serveur Web.
    2. Ensuite, dans la console Firebase, ouvrez la section Authentification.

    3. Dans l'onglet Mode de connexion, activez la connexion à Play Jeux. un fournisseur de services agréé. Vous devez spécifier le serveur Web de votre projet et le code secret du client, obtenus dans la console des API.

Configurer Play Games services avec les informations de votre application Firebase

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

  2. Dans la section Croissance, cliquez sur Play Games services > Configuration et Gestion > Configuration.

  3. Cliquez sur Oui, mon jeu utilise déjà des API Google, puis sélectionnez votre projet Firebase projet dans la liste, puis cliquez sur Utiliser.

  4. Sur la page de configuration Play Games services, cliquez sur Ajouter un identifiant

    1. Sélectionnez le type Game server (Serveur de jeu).
    2. Dans le champ Client OAuth, sélectionnez l'ID client Web de votre projet. Être assurez-vous qu'il s'agit du même ID client que celui spécifié lors de l'activation Connexion à Play Games.
    3. Enregistrez les modifications.
  5. Toujours sur la page de configuration Play Games services, cliquez sur Ajouter un identifiant.

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

Intégrer la connexion Play Jeux à votre jeu

Commencez par intégrer la fonctionnalité de connexion à Play Jeux dans votre application. Voir Se connecter à des jeux Android pour obtenir des instructions détaillées.

Dans votre intégration, lorsque vous créez l'objet GoogleSignInOptions, utilisez la méthode Configuration DEFAULT_GAMES_SIGN_IN et appelez requestServerAuthCode:

Kotlin+KTX

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 votre ID client de serveur Web à la méthode requestServerAuthCode. Il s'agit de l'ID que vous avez fourni lorsque vous avez activé la connexion à Play Jeux dans la Console Firebase.

Authentifier avec Firebase

Après avoir ajouté la connexion Play Jeux à votre application, vous devez configurer Firebase pour qu'il utilise les identifiants du compte Google que vous recevez lorsqu'un joueur se connecte avec Play Jeux.

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

Kotlin+KTX

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 lecteur est déjà signé. avec Firebase:

Kotlin+KTX

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é à Play Jeux de manière silencieuse ou interactive, obtenez le code d'autorisation à partir de l'objet GoogleSignInAccount, puis échangez-le contre les identifiants Firebase et l'authentification auprès de Firebase à l'aide du identifiant:

Kotlin+KTX

// 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 de signInWithCredential aboutit, vous pouvez utiliser la méthode getCurrentUser pour obtenir les données du 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 Play Jeux. Ce nouveau compte est stocké dans votre dans votre projet Firebase. Vous pouvez l'utiliser pour identifier un utilisateur dans toutes les applications de votre projet.

Dans votre jeu, vous pouvez obtenir l'ID Firebase de l'utilisateur à partir de FirebaseUser objet:

Kotlin+KTX

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 votre base de données Firebase Realtime Database et vos règles de sécurité Cloud Storage, vous pouvez obtenir l'ID utilisateur unique de l'utilisateur connecté à partir de la variable auth et utilisez-le pour contrôler les données auxquelles un utilisateur peut accéder.

Pour obtenir les informations de joueur Play Jeux d'un utilisateur ou pour accéder aux services de jeux Play, procédez comme suit : utiliser les API fournies par le SDK Google Play Jeux ;

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

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();