المصادقة باستخدام "خدمات ألعاب Google Play" على Android

يمكنك استخدام "خدمات ألعاب Google Play" لتسجيل دخول اللاعبين إلى لعبة Android مُنشأة على Firebase. لاستخدام ميزة تسجيل الدخول باستخدام Firebase في "خدمات ألعاب Google Play"، عليك أولاً تسجيل دخول اللاعب باستخدام "ألعاب 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، عليك إضافة حزمة تطوير البرامج (SDK) لـ "خدمات Google Play" إلى تطبيقك.

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:33.7.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.3.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.3.0")
    }
    هل تبحث عن وحدة مكتبة خاصة بلغة Kotlin؟ اعتبارًا من تشرين الأول (أكتوبر) 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 auth.

      للعثور على هذه القيم:

      1. افتح مشروعك على Firebase في صفحة بيانات اعتماد وحدة تحكُّم Google APIs.
      2. في قسم معرّفات عملاء OAuth 2.0، افتح صفحة تفاصيل عميل الويب (تم إنشاؤه تلقائيًا من خلال خدمة Google). تعرض هذه الصفحة معرّف العميل وسر العميل لخدمة web server.
    2. بعد ذلك، في وحدة تحكّم Firebase، افتح قسم المصادقة.

    3. في علامة التبويب طريقة تسجيل الدخول، فعِّل مقدّم خدمات تسجيل الدخول في ألعاب Play. عليك تحديد معرّف العميل وسر العميل لخوادم الويب في مشروعك، وهما متوفرَان في وحدة تحكّم واجهات برمجة التطبيقات.

ضبط Play Games services باستخدام معلومات تطبيقك على Firebase

  1. في وحدة تحكّم Google Play، افتح تطبيق 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();
  1. عند بدء النشاط، تحقَّق ممّا إذا كان اللاعب قد سجَّل الدخول من خلال 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" إما بشكل صامت أو تفاعلي، احصل على رمز المصادقة من عنصر 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 Games. يتم تخزين هذا الحساب الجديد كجزء من مشروعك على 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 في الوقت الفعلي" و"مساحة تخزين السحابة الإلكترونية"، يمكنك الحصول على معرّف المستخدم الفريد للمستخدم الذي سجّل الدخول من المتغيّر auth واستخدامه للتحكّم في البيانات التي يمكن للمستخدم الوصول إليها.

للحصول على معلومات لاعب "ألعاب Play" الخاصة بالمستخدم أو للوصول إلى خدمات "ألعاب Play"، استخدِم واجهات برمجة التطبيقات التي يوفّرها Google Play Games SDK.

لتسجيل خروج مستخدم، يُرجى الاتصال على FirebaseAuth.signOut():

Kotlin

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();