אימות באמצעות Google Play Games Services ב-Android

אתם יכולים להשתמש בשירותי Google Play Games כדי לאפשר לשחקנים להתחבר למשחק ל-Android שנבנה על Firebase. כדי להשתמש ב-Firebase כדי להיכנס לשירותי Google Play Games, קודם צריך להכניס את השחקן לחשבון ב-Google Play Games ולבקש קוד אימות OAuth 2.0PlayGamesAuthProvider

לפני שמתחילים

הגדרת הפרויקט ל-Android

  1. אם עדיין לא עשיתם זאת, מוסיפים את Firebase לפרויקט Android.

  2. בקובץ Gradle של המודול (ברמת האפליקציה) (בדרך כלל <project>/<app-module>/build.gradle.kts או <project>/<app-module>/build.gradle), מוסיפים את התלות בספרייה Firebase Authentication ל-Android. מומלץ להשתמש ב-Firebase Android BoM כדי לשלוט בגרסאות הספרייה.

    בנוסף, כחלק מהגדרת Firebase Authentication, צריך להוסיף לאפליקציה את ה-SDK של Google Play Services.

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

    כשמשתמשים ב-Firebase Android BoM, האפליקציה תמיד תשתמש בגרסאות תואמות של ספריות Firebase ל-Android.

    (חלופה)  מוסיפים יחסי תלות לספריות של Firebase בלי להשתמש ב-BoM

    אם בוחרים שלא להשתמש ברכיב Firebase BoM, צריך לציין כל גרסה של ספריית Firebase בשורת התלות שלה.

    שימו לב: אם אתם משתמשים במספר ספריות של Firebase באפליקציה, מומלץ מאוד להשתמש ב-BoM כדי לנהל את הגרסאות של הספריות, וכך לוודא שכל הגרסאות תואמות.

    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.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.2.0")
    }
    מחפשים מודול ספרייה ספציפי ל-Kotlin? החל מ-אוקטובר 2023 (Firebase BoM 32.5.0), מפתחי Kotlin ומפתחי Java יוכלו להסתמך על מודול הספרייה הראשי (פרטים נוספים זמינים בשאלות הנפוצות לגבי היוזמה הזו).

הגדרת פרויקט Firebase

  1. מגדירים את טביעת האצבע של המשחק ב-SHA-1 בדף Settings במסוף Firebase.

    אפשר לקבל את גיבוב ה-SHA של אישור החתימה באמצעות הפקודה signingReport של gradle:

    ./gradlew signingReport

  2. מפעילים את Google Play Games כספק כניסה:

    1. מחפשים את מזהה הלקוח ואת סוד הלקוח של שרת האינטרנט של הפרויקט. מזהה הלקוח של שרת האינטרנט משמש לזיהוי פרויקט Firebase שלכם לשרתי האימות של Google Play.

      כדי למצוא את הערכים האלה:

      1. פותחים את פרויקט Firebase בדף פרטי הכניסה ב-מסוף Google APIs.
      2. בקטע OAuth 2.0 client IDs, פותחים את דף הפרטים Web client (נוצר באופן אוטומטי על ידי Google Service). בדף הזה מפורטים מזהה הלקוח והסוד של שרת האינטרנט.
    2. לאחר מכן, במסוף Firebase, פותחים את הקטע Authentication.

    3. בכרטיסייה שיטת כניסה, מפעילים את ספק הכניסה של Play Games. תצטרכו לציין את מזהה הלקוח ואת סוד הלקוח של שרת האינטרנט של הפרויקט, שקיבלתם במסוף ממשקי ה-API.

הגדרת Play Games services עם פרטי האפליקציה ב-Firebase

  1. במסוף Google Play, פותחים את אפליקציית Google Play או יוצרים אפליקציה.

  2. בקטע צמיחה, לוחצים על Play Games services > הגדרה וניהול > הגדרה.

  3. לוחצים על Yes, my game already שמשתמש ב-Google APIs, בוחרים את הפרויקט ב-Firebase מהרשימה ואז לוחצים על Use.

  4. בדף ההגדרה של Play Games services, לוחצים על Add Credential.

    1. בוחרים את הסוג שרת משחקים.
    2. בשדה לקוח OAuth, בוחרים את מזהה הלקוח באינטרנט של הפרויקט. חשוב לוודא שזהו אותו מזהה לקוח שציינתם כשהפעלתם את הכניסה באמצעות Play Games.
    3. שומרים את השינויים.
  5. בדף ההגדרה של Play Games services, לוחצים שוב על Add Credential.

    1. בוחרים את הסוג Android.
    2. בשדה לקוח OAuth, בוחרים את מזהה הלקוח של Android של הפרויקט. (אם לא רואים את מזהה הלקוח של Android, צריך להגדיר את טביעת האצבע SHA-1 של המשחק במסוף Firebase).
    3. שומרים את השינויים.
  6. בדף Testers תוכלו להוסיף את כתובות האימייל של כל המשתמשים שצריכים להיכנס למשחק לפני ההשקה שלו ב-Play Store.

שילוב של כניסה ל-Play Games במשחק

קודם כול, צריך לשלב את הכניסה ל-Play Games באפליקציה. ההוראות המלאות מפורטות במאמר כניסה למשחקים ב-Android.

בשילוב, כשיוצרים את האובייקט GoogleSignInOptions, משתמשים בהגדרה DEFAULT_GAMES_SIGN_IN וקוראים לפונקציה 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();

עליך להעביר את מזהה הלקוח של שרת האינטרנט ל-method requestServerAuthCode. זהו המזהה שסיפקת כשהפעלת את הכניסה ל-Play Games במסוף Firebase.

אימות באמצעות Firebase

אחרי שמוסיפים לאפליקציה את האפשרות להיכנס באמצעות Play Games, צריך להגדיר את Firebase כך שישתמש בפרטי הכניסה לחשבון Google שמקבלים כששחקן נכנס בהצלחה באמצעות Play Games.

  1. קודם כול, בשיטה onCreate של פעילות הכניסה, מקבלים את המופע המשותף של האובייקט 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. כשמפעילים את הפעילות, צריך לבדוק אם השחקן כבר נכנס לחשבון באמצעות 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. אחרי שמשתמש נכנס לחשבון ב-Play Games באופן אוטומטי או באופן אינטראקטיבי, מקבלים את קוד האימות מהאובייקט GoogleSignInAccount, מחליפים אותו בפרטי כניסה ל-Firebase ומבצעים אימות ב-Firebase באמצעות פרטי הכניסה ל-Firebase:

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

                    // ...
                }
            });
}

אם הקריאה ל-signInWithCredential תצליח, תוכלו להשתמש בשיטה getCurrentUser כדי לקבל את נתוני החשבון של המשתמש.

השלבים הבאים

אחרי שמשתמש נכנס לחשבון בפעם הראשונה, נוצר חשבון משתמש חדש שמקושר למזהה שלו ב-Play Games. החשבון החדש הזה מאוחסן כחלק מפרויקט Firebase, וניתן להשתמש בו כדי לזהות משתמש בכל האפליקציות בפרויקט.

במשחק, אפשר לקבל את מזהה המשתמש ב-Firebase מהאובייקט FirebaseUser:

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

במסגרת כללי האבטחה של Firebase Realtime Database ושל Cloud Storage, אפשר לקבל את מזהה המשתמש הייחודי של המשתמש שנכנס לחשבון מהמשתנה auth, ולהשתמש בו כדי לקבוע לאילו נתונים למשתמש תהיה גישה.

כדי לקבל את פרטי השחקן של משתמש ב-Play Games או כדי לגשת לשירותי Play Games, צריך להשתמש בממשקי ה-API שסופקו על ידי Google Play Games SDK.

כדי לצאת ממשתמש, צריך להתקשר אל FirebaseAuth.signOut():

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();