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

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

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

הגדרת הפרויקט ל-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.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")
    }

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

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

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

    אפשר להשתמש בגרד הפקודה signingReport:

    ./gradlew signingReport

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

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

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

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

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

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

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

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

  3. לוחצים על כן, המשחק שלי כבר משתמש ב-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. בדף בודקים, מוסיפים את כתובות האימייל של המשתמשים שצריכים את המידע להיות מסוגלים להיכנס למשחק שלכם לפני הפרסום שלו 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, ואפשר להשתמש בו כדי לזהות משתמש בכל האפליקציות פרויקט.

במשחק שלך אפשר לקבל את ה-UID של המשתמש ב-Firebase דרך FirebaseUser object:

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 וכללי אבטחה של Cloud Storage, אפשר לקבל מזהה המשתמש הייחודי של המשתמש המחובר מהמשתנה auth, ולהשתמש בו כדי לקבוע לאילו נתונים המשתמש יכול לגשת.

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

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

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();