المصادقة باستخدام "خدمات ألعاب 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 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:34.12.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.1")
    }

    باستخدام 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: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.1")
    }

إعداد مشروع Firebase

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

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

    ./gradlew signingReport

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

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

      للعثور على هاتَين القيمتَين:

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

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

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

  1. في Console، افتح تطبيقك أو أنشئ تطبيقًا.Google PlayGoogle 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();
  2. عند تهيئة النشاط، تحقَّق مما إذا كان اللاعب قد سجّل الدخول باستخدام 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);
    }

    إذا لم يكن اللاعب قد سجّل الدخول، اعرض له تجربة تسجيل الخروج من لعبتك، بما في ذلك خيار تسجيل الدخول.

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

في لعبتك، يمكنك الحصول على رقم تعريف المستخدم (UID) على 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 في الوقت الفعلي وCloud Storage، يمكنك الحصول على رقم تعريف المستخدم الفريد للمستخدم الذي سجّل الدخول من متغيّر auth، واستخدامه للتحكّم في البيانات التي يمكن للمستخدم الوصول إليها.

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

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

Kotlin

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();