المصادقة باستخدام "خدمات ألعاب 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. ننصح باستخدام بنود سياسة Android في Firebase للتحكّم في نُسَخ المكتبة.

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

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

    باستخدام أداة إدارة قوائم التشغيل Android في Firebase، سيستخدم تطبيقك دائمًا الإصدارات المتوافقة من مكتبات 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.1.1")
    }
    هل تبحث عن وحدة مكتبة خاصة بلغة Kotlin؟ اعتبارًا من تشرين الأول (أكتوبر) 2023 (الإصدار 32.5.0 من Firebase)، أصبح بإمكان مطوّري لغة Kotlin وJava الاعتماد على وحدة المكتبة الرئيسية (لمعرفة التفاصيل، يُرجى الاطّلاع على الأسئلة الشائعة حول هذه المبادرة).

إعداد مشروع Firebase

  1. اضبط بصمة SHA-1 للعبتك من صفحة الإعدادات في وحدة تحكم Firebase.

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

    ./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 من القائمة، ثم انقر على استخدام.

  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();