المصادقة باستخدام "خدمات ألعاب 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 لنظام التشغيل Android. ننصحك باستخدام برنامج Firebase Android BoM للتحكّم في إصدارات المكتبة.

    وأيضًا، كجزء من إعداد مصادقة Firebase، يجب أيضًا إضافة حزمة SDK لخدمات Google Play إلى تطبيقك.

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

    باستخدام إطار عمل Android BoM، سيستخدم تطبيقك دائمًا إصدارات متوافقة من مكتبات Android في Firebase.

    (بديل) أضِف تبعيات مكتبة Firebase بدون استخدام قائمة BoM.

    إذا اختَرت عدم استخدام قائمة مشروعات Firebase، يجب تحديد كل إصدار من إصدارات مكتبة 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.

    يمكنك الحصول على تجزئة SHA لشهادة التوقيع باستخدام الأمر signingReport:

    ./gradlew signingReport

  2. تفعيل "ألعاب Google Play" كمقدّم تسجيل الدخول:

    1. ابحث عن معرِّف العميل لخادم الويب وسر العميل لمشروعك. يحدّد معرِّف العميل لخادم الويب مشروعك في Firebase لخوادم المصادقة Google Play.

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

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

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

إعداد خدمات "ألعاب Play" باستخدام معلومات تطبيقك على Firebase

  1. في Google Play Console، افتح تطبيق Google Play أو أنشئ تطبيقًا.

  2. في قسم النمو، انقر على خدمات ألعاب Play > الإعداد والإدارة > الضبط.

  3. انقر على نعم، تستخدم لعبتي Google APIs حاليًا، واختَر مشروع Firebase من القائمة، ثم انقر على Use (استخدام).

  4. في صفحة ضبط "خدمات ألعاب Play"، انقر على إضافة بيانات اعتماد.

    1. اختَر النوع خادم اللعبة.
    2. في الحقل عميل OAuth، اختَر معرِّف عميل الويب لمشروعك. تأكَّد من أنّ هذا هو معرّف العميل نفسه الذي حددته عند تفعيل ميزة "تسجيل الدخول إلى ألعاب Play".
    3. احفظ التغييرات.
  5. في صفحة إعداد "خدمات ألعاب Play"، انقر على إضافة بيانات اعتماد مرة أخرى.

    1. اختَر النوع Android.
    2. في الحقل عميل OAuth، اختَر معرّف عميل Android لمشروعك. (إذا لم يظهر لك معرّف العميل لنظام التشغيل Android، تأكّد من ضبط بصمة إصبع SHA-1 اللعبة في وحدة تحكُّم Firebase).
    3. احفظ التغييرات.
  6. في صفحة المختبِرون، أضِف عناوين البريد الإلكتروني لأي مستخدم يحتاج إلى التمكّن من تسجيل الدخول إلى لعبتك قبل إصدارها على "متجر Play".

دمج ميزة "تسجيل الدخول إلى "ألعاب Play" في لعبتك

يجب أولاً دمج ميزة "تسجيل الدخول إلى ألعاب Play" في تطبيقك. ويمكنك الاطّلاع على تسجيل الدخول إلى ألعاب 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();

يجب إدخال معرِّف العميل لخادم الويب إلى الطريقة requestServerAuthCode. هذا هو رقم التعريف الذي قدّمته عند تفعيل ميزة تسجيل الدخول إلى "ألعاب Play" في وحدة تحكّم Firebase.

المصادقة مع Firebase

بعد إضافة معلومات تسجيل الدخول إلى "ألعاب Play" إلى تطبيقك، عليك إعداد Firebase لاستخدام بيانات اعتماد حساب Google التي تحصل عليها عند تسجيل اللاعب الدخول بنجاح باستخدام "ألعاب Play".

  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" إما بدون تنبيه أو تفاعل، يمكنك الحصول على رمز المصادقة من عنصر 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". ويتم تخزين هذا الحساب الجديد كجزء من مشروع Firebase، ويمكن استخدامه لتحديد مستخدم في كل تطبيق ضمن مشروعك.

في لعبتك، يمكنك الحصول على المعرّف الفريد للمستخدم في Firebase من الكائن FirebaseUser:

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" للمستخدم أو للوصول إلى خدمات "ألعاب Play"، استخدِم واجهات برمجة التطبيقات التي توفِّرها حزمة تطوير البرامج (SDK) لألعاب Google Play.

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

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();