احراز هویت با استفاده از خدمات بازی‌های Google Play در اندروید

می‌توانید از خدمات بازی‌های Google Play برای ورود بازیکنان به یک بازی Android ساخته‌شده در Firebase استفاده کنید. برای استفاده از ورود به سیستم سرویس‌های بازی‌های Google Play با Firebase، ابتدا بازیکن را با بازی‌های Google Play وارد کنید و در صورت انجام این کار، کد تأیید OAuth 2.0 را درخواست کنید. سپس، کد احراز هویت را به PlayGamesAuthProvider ارسال کنید تا یک اعتبار Firebase ایجاد کند، که می توانید از آن برای احراز هویت با Firebase استفاده کنید.

قبل از شروع

پروژه اندروید خود را راه اندازی کنید

  1. اگر قبلاً این کار را نکرده‌اید، Firebase را به پروژه Android خود اضافه کنید .

  2. در فایل Gradle ماژول (سطح برنامه) خود (معمولا <project>/<app-module>/build.gradle.kts یا <project>/<app-module>/build.gradle )، وابستگی را برای Firebase Authentication اضافه کنید. کتابخانه برای اندروید توصیه می‌کنیم از Firebase Android BoM برای کنترل نسخه‌سازی کتابخانه استفاده کنید.

    همچنین، به عنوان بخشی از راه‌اندازی Firebase Authentication ، باید SDK خدمات Google Play را به برنامه خود اضافه کنید.

    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 را در خط وابستگی آن مشخص کنید.

    توجه داشته باشید که اگر از چندین کتابخانه 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")
    }
    به دنبال یک ماژول کتابخانه خاص کاتلین هستید؟ از اکتبر 2023 ( Firebase BoM 32.5.0) ، توسعه دهندگان Kotlin و Java می توانند به ماژول کتابخانه اصلی وابسته باشند (برای جزئیات، به سؤالات متداول در مورد این ابتکار مراجعه کنید).

پروژه Firebase خود را راه اندازی کنید

  1. اثر انگشت SHA-1 بازی خود را از صفحه تنظیمات کنسول Firebase تنظیم کنید.

    می توانید هش SHA گواهی امضای خود را با دستور gradle signingReport دریافت کنید:

    ./gradlew signingReport

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

    1. شناسه سرویس گیرنده وب سرور و رمز سرویس گیرنده پروژه خود را پیدا کنید. شناسه سرویس گیرنده وب سرور، پروژه Firebase شما را در سرورهای تأیید اعتبار Google Play شناسایی می کند.

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

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

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

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

  1. در کنسول Google Play ، برنامه Google Play خود را باز کنید یا یکی ایجاد کنید.

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

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

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

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

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

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

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

در ادغام خود، هنگامی که شیء GoogleSignInOptions را می‌سازید، از پیکربندی DEFAULT_GAMES_SIGN_IN استفاده کنید و requestServerAuthCode را فراخوانی کنید:

val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
    .requestServerAuthCode(getString(R.string.default_web_client_id))
    .build()
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 را دریافت کنید:
private lateinit var auth: FirebaseAuth
// ...
// Initialize Firebase Auth
auth = Firebase.auth
private FirebaseAuth mAuth;
// ...
// Initialize Firebase Auth
mAuth = FirebaseAuth.getInstance();
  1. هنگام تنظیم اولیه Activity خود، بررسی کنید که آیا بازیکن قبلاً با Firebase وارد شده است یا خیر:
override fun onStart() {
    super.onStart()
    // Check if user is signed in (non-null) and update UI accordingly.
    val currentUser = auth.currentUser
    updateUI(currentUser)
}
@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 وارد شد، کد تأیید اعتبار را از شی GoogleSignInAccount دریافت کنید، آن را با اعتبار Firebase مبادله کنید و با استفاده از اعتبار Firebase با Firebase احراز هویت کنید:
// 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)
            }

            // ...
        }
}
// 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 دریافت کنید:

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
}
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»، از API‌های ارائه‌شده توسط Google Play Games SDK استفاده کنید.

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

Firebase.auth.signOut()
FirebaseAuth.getInstance().signOut();