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

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

قبل از اینکه شروع کنی

پروژه اندروید خود را تنظیم کنید

  1. اگر هنوز Firebase را به پروژه اندروید خود اضافه نکرده‌اید، آن را اضافه کنید.

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

    همچنین، به عنوان بخشی از راه‌اندازی Firebase Authentication ، باید SDK سرویس‌های گوگل پلی را به برنامه خود اضافه کنید.

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

    با استفاده از Firebase Android BoM ، برنامه شما همیشه از نسخه‌های سازگار کتابخانه‌های اندروید Firebase استفاده خواهد کرد.

    (جایگزین) اضافه کردن وابستگی‌های کتابخانه 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:24.0.1")
    // Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:21.5.0")
    }

پروژه Firebase خود را تنظیم کنید

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

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

    ./gradlew signingReport

  2. فعال کردن بازی‌های گوگل پلی به عنوان ارائه‌دهنده‌ی ورود:

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

      برای یافتن این مقادیر:

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

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

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

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

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

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

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

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

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

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

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

در یکپارچه‌سازی خود، هنگام ساخت شیء 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 Games در کنسول Firebase ارائه کرده‌اید.

احراز هویت با فایربیس

بعد از اینکه ورود به سیستم Play Games را به برنامه خود اضافه کردید، باید Firebase را طوری تنظیم کنید که از اعتبارنامه‌های حساب گوگل که هنگام ورود موفقیت‌آمیز یک بازیکن به Play Games دریافت می‌کنید، استفاده کند.

  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();
  1. هنگام مقداردهی اولیه Activity، بررسی کنید که آیا بازیکن قبلاً با 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);
}
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

// 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 شما ذخیره می‌شود و می‌تواند برای شناسایی کاربر در هر برنامه در پروژه شما استفاده شود.

در بازی خود، می‌توانید شناسه کاربری 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، می‌توانید شناسه کاربری منحصر به فرد کاربر وارد شده را از متغیر auth دریافت کنید و از آن برای کنترل داده‌هایی که کاربر می‌تواند به آنها دسترسی داشته باشد، استفاده کنید.

برای دریافت اطلاعات بازیکن Play Games کاربر یا دسترسی به سرویس‌های Play Games، از APIهای ارائه شده توسط Google Play Games SDK استفاده کنید.

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

Kotlin

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();