احراز هویت بااستفاده از «خدمات بازی Google Play» در Android

می‌توانید از سرویس‌های «بازی‌های Google Play» برای ورود به سیستم بازیکنان در بازی Android ساخته‌شده در Firebase استفاده کنید. برای استفاده از ورود به سیستم «سرویس‌های بازی‌های Google Play» با Firebase، ابتدا بازیکن را با «سرویس‌های بازی‌های Google Play» به سیستم وارد کنید و هنگام انجام این کار، کد اصالت‌سنجی 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، باید کیت توسعه نرم‌افزار خدمات Google Play را به برنامه‌تان اضافه کنید.

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:35.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:22.0.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:25.0.0")
    // Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:22.0.0")
    }

راه‌اندازی پروژه Firebase

  1. در کنسول Firebase، به امنیت > اصالت‌سنجی بروید.

  2. در برگه تنظیمات، اثر انگشت SHA-1 بازی‌تان را تنظیم کنید.

    می‌توانید مقدار درهم‌سازی SHA گواهینامه امضایتان را با فرمان gradle signingReport دریافت کنید:

    ./gradlew signingReport

  3. «بازی‌های Google Play» را به‌عنوان ارائه‌دهنده ورود به سیستم فعال کنید:

    1. شناسه کارخواه و رمز کارخواه سرور وب پروژه‌تان را پیدا کنید. شناسه کارخواه سرور وب پروژه Firebase شما را به سرورهای احراز هویت Google Play معرفی می‌کند.

      برای پیدا کردن این مقادیر:

      1. پروژه Firebase خود را در صفحه Google APIs console گواهینامه‌ها باز کنید.
      2. در بخش شناسه‌های کارخواه OAuth 2.0، صفحه جزئیات کارخواه وب (ایجادشده خودکار توسط «خدمات Google») را باز کنید. این صفحه رمز و شناسه کارخواه کارساز وب شما را فهرست می‌کند.
    2. در کنسول Firebase، به امنیت > اصالت‌سنجی بروید.

    3. در برگه روش ورود به سیستم، ارائه‌دهنده ورود به سیستم خدمات بازی Play را فعال کنید. باید شناسه کارخواه سرور وب پروژه و رمز کارخواه خود را که از کنسول «میاناهای برنامه‌سازی کاربردی» دریافت کرده‌اید مشخص کنید.

‫Play Games services را با اطلاعات برنامه Firebase پیکربندی کنید

  1. در Google Play Console، برنامه Google Play را باز کنید یا برنامه‌ای ایجاد کنید.

  2. در بخش رشد، روی Play Games services > راه‌اندازی و مدیریت > پیکربندی کلیک کنید.

  3. روی بله، بازی من ازقبل از Google APIs استفاده می‌کند کلیک کنید، پروژه Firebase خود را از فهرست انتخاب کنید، و سپس روی استفاده کردن کلیک کنید.

  4. در صفحه پیکربندی Play Games services، روی افزودن اطلاعات اعتباری کلیک کنید.

    1. نوع سرور بازی را انتخاب کنید.
    2. در فیلد کارخواه OAuth، شناسه کارخواه وب پروژه‌تان را انتخاب کنید. مطمئن شوید این همان شناسه کلاینتی است که هنگام فعال کردن ورود به سیستم Play Games مشخص کرده‌اید.
    3. تغییرات خود را ذخیره کنید.
  5. همچنان در صفحه پیکربندی Play Games services، دوباره روی افزودن اطلاعات اعتباری کلیک کنید.

    1. نوع Android را انتخاب کنید.
    2. در فیلد کارخواه OAuth، شناسه کارخواه Android پروژه‌تان را انتخاب کنید. (اگر شناسه مشتری Android خود را نمی‌بینید، مطمئن شوید که اثر انگشت SHA-1 بازی خود را در کنسول Firebase تنظیم کرده‌اید.)
    3. تغییرات خود را ذخیره کنید.
  6. در صفحه آزمایشگران، نشانی‌های ایمیل کاربرانی را که باید بتوانند قبل‌از انتشار بازی‌تان در Play Store به سیستم وارد شوند اضافه کنید.

ادغام کردن ورود به سیستم «بازی‌های Play» در بازی

ابتدا، ورود به سیستم «بازی‌های Play» را در برنامه‌تان ادغام کنید. برای دریافت دستورالعمل‌های کامل، به ورود به سیستم «بازی‌های Android» مراجعه کنید.

در ادغام خود، هنگام ساختن شیء GoogleSignInOptions، از پیکربندی DEFAULT_GAMES_SIGN_IN استفاده کنید و 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();

باید شناسه کارخواه سرور وب خود را به روش requestServerAuthCode ارسال کنید. این همان شناسه‌ای است که هنگام فعال کردن ورود به سیستم «بازی‌های Play» در Firebase کنسول ارائه کردید.

اصالت‌سنجی با Firebase

پس‌از افزودن ورود به سیستم «بازی‌های Play» به برنامه‌تان، باید Firebase را راه‌اندازی کنید تا از اطلاعات اعتباری «حساب Google» که وقتی بازیکنی با موفقیت با «بازی‌های Play» به سیستم وارد می‌شود دریافت می‌کنید استفاده کند.

  1. ابتدا، در روش onCreate فعالیت ورود به سیستم، نمونه هم‌رسانی‌شده شیء FirebaseAuth را دریافت کنید:

    Kotlin

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

    Java

    private FirebaseAuth mAuth;
    // ...
    // Initialize Firebase Auth
    mAuth = FirebaseAuth.getInstance();
  2. هنگام مقداردهی اولیه «فعالیت»، بررسی کنید که آیا بازیکن قبلاً با 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);
    }

    اگر بازیکن به سیستم وارد نشده است، تجربه خارج شدن از سیستم بازی‌تان را به بازیکن ارائه دهید، ازجمله گزینه ورود به سیستم.

  3. پس‌از اینکه بازیکنی به‌صورت تعاملی یا بی‌صدا با «بازی‌های Play» به سیستم وارد شد، کد اصالت‌سنجی را از شیء GoogleSignInAccount دریافت کنید، آن را با اطلاعات اعتباری Firebase مبادله کنید، و بااستفاده از اطلاعات اعتباری Firebase با 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);
                        }
    
                        // ...
                    }
                });
    }

    اگر تماس با signInWithCredential موفقیت‌آمیز باشد، می‌توانید از روش getCurrentUser برای دریافت داده‌های حساب کاربر استفاده کنید.

مراحل بعدی

پس‌از اینکه کاربر برای اولین‌بار به سیستم وارد شد، حساب کاربری جدیدی ایجاد می‌شود و به شناسه «بازی‌های Play» او پیوند داده می‌شود. این حساب جدید به‌عنوان بخشی از پروژه Firebase شما ذخیره می‌شود و می‌توان از آن برای شناسایی کاربر در همه برنامه‌های پروژه استفاده کرد.

در بازی‌تان، می‌توانید UID کاربر Firebase را از 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();

در «قوانین امنیتی» Firebase Realtime Database و Cloud Storage، می‌توانید شناسه کاربر یکتای کاربر واردشده به سیستم را از متغیر auth دریافت کنید و از آن برای کنترل داده‌هایی که کاربر می‌تواند به آن‌ها دسترسی داشته باشد استفاده کنید.

برای دریافت اطلاعات بازیکن «بازی‌های Play» یا دسترسی به خدمات «بازی‌های Play»، از میاناهای برنامه‌سازی کاربردی ارائه‌شده توسط کیت توسعه نرم‌افزار «بازی‌های Google Play» استفاده کنید.

برای خروج کاربر از سیستم، FirebaseAuth.signOut() را فراخوانی کنید:

Kotlin

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();