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

يمكنك استخدام خدمات ألعاب Google Play لتسجيل دخول اللاعبين إلى لعبة Android مبنية على Firebase. لاستخدام خدمات ألعاب Google Play، قم بتسجيل الدخول باستخدام Firebase، قم أولاً بتسجيل دخول اللاعب باستخدام Google Play Games، واطلب رمز مصادقة OAuth 2.0 عند القيام بذلك. بعد ذلك، قم بتمرير رمز المصادقة إلى PlayGamesAuthProvider لإنشاء بيانات اعتماد Firebase، والتي يمكنك استخدامها للمصادقة مع Firebase.

قبل ان تبدأ

قم بإعداد مشروع Android الخاص بك

  1. إذا لم تكن قد قمت بذلك بالفعل، فأضف Firebase إلى مشروع Android الخاص بك .

  2. في ملف Gradle الخاص بالوحدة النمطية (على مستوى التطبيق) (عادةً <project>/<app-module>/build.gradle.kts أو <project>/<app-module>/build.gradle )، أضف التبعية لمصادقة Firebase مكتبة لالروبوت. نوصي باستخدام Firebase Android BoM للتحكم في إصدار المكتبة.

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

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:32.8.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.0.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:22.3.1")
    // Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:21.0.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 الخاص بك من القائمة، ثم انقر فوق استخدام .

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

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

    1. حدد نوع أندرويد .
    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 UID الخاص بالمستخدم من كائن 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 Realtime وقواعد أمان التخزين السحابي، يمكنك الحصول على معرف المستخدم الفريد للمستخدم الذي قام بتسجيل الدخول من متغير auth ، واستخدامه للتحكم في البيانات التي يمكن للمستخدم الوصول إليها.

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

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

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();