ตรวจสอบสิทธิ์โดยใช้บริการเกมของ 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) เพิ่มทรัพยากร Dependency สำหรับไลบรารีการตรวจสอบสิทธิ์ Firebase สำหรับ Android เราขอแนะนำให้ใช้ BoM ของ Firebase Android เพื่อควบคุมการกำหนดเวอร์ชันไลบรารี

    นอกจากนี้ ในฐานะที่เป็นส่วนหนึ่งของการตั้งค่าการตรวจสอบสิทธิ์ Firebase คุณจะต้องเพิ่ม SDK ของบริการ Google Play ลงในแอปของคุณ

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

    การใช้ Firebase Android BoM แอปจะใช้ไลบรารี Firebase Android เวอร์ชันที่เข้ากันได้เสมอ

    (ทางเลือก) เพิ่มทรัพยากร Dependency ของไลบรารี Firebase โดยไม่ต้องใช้ BoM

    หากเลือกไม่ใช้ Firebase BoM คุณต้องระบุเวอร์ชันไลบรารี Firebase แต่ละเวอร์ชัน ในบรรทัดทรัพยากร Dependency

    โปรดทราบว่าหากคุณใช้ไลบรารี 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 ของใบรับรองที่ลงนามได้ด้วย Gradle คำสั่ง signingReport: วันที่

    ./gradlew signingReport

  2. เปิดใช้ Google Play Games เป็นผู้ให้บริการการลงชื่อเข้าใช้

    1. ค้นหารหัสไคลเอ็นต์สำหรับเว็บเซิร์ฟเวอร์และรหัสลับไคลเอ็นต์ของโปรเจ็กต์ เว็บ รหัสไคลเอ็นต์ของเซิร์ฟเวอร์จะระบุโปรเจ็กต์ Firebase ของคุณไปยัง Google Play เซิร์ฟเวอร์การตรวจสอบสิทธิ์

      วิธีค้นหาค่าเหล่านี้

      1. เปิดโปรเจ็กต์ Firebase ในหน้าข้อมูลเข้าสู่ระบบของคอนโซล Google APIs
      2. ในส่วนรหัสไคลเอ็นต์ OAuth 2.0 ให้เปิดเว็บไคลเอ็นต์ (อัตโนมัติ) สร้างโดยบริการของ Google) หน้านี้จะแสดงรายการเว็บของคุณ รหัสไคลเอ็นต์และข้อมูลลับของเซิร์ฟเวอร์
    2. จากนั้นเปิดส่วนการตรวจสอบสิทธิ์ในคอนโซล Firebase

    3. ในแท็บวิธีการลงชื่อเข้าใช้ ให้เปิดใช้การลงชื่อเข้าใช้ Play Games คุณจะต้องระบุเว็บเซิร์ฟเวอร์ของโปรเจ็กต์ รหัสไคลเอ็นต์และรหัสลับไคลเอ็นต์ ซึ่งได้จากคอนโซล API

กำหนดค่าบริการเกมของ Play ด้วยข้อมูลแอป Firebase ของคุณ

  1. ใน Google Play Console เปิดแอป Google Play หรือสร้างขึ้นใหม่

  2. ในส่วนขยาย ให้คลิก บริการเกมของ Play > การตั้งค่าและ การจัดการ > การกำหนดค่า

  3. คลิกใช่ เกมของฉันใช้ Google APIs อยู่แล้ว เลือก Firebase จากรายการ แล้วคลิกใช้

  4. ในหน้าการกำหนดค่าบริการเกมของ Play ให้คลิก เพิ่มข้อมูลเข้าสู่ระบบ

    1. เลือกประเภทเซิร์ฟเวอร์เกม
    2. เลือกรหัสไคลเอ็นต์ของเว็บของโปรเจ็กต์ในช่องไคลเอ็นต์ OAuth เป็น ตรวจสอบว่าเป็นรหัสไคลเอ็นต์ที่คุณระบุไว้เมื่อเปิดใช้ การลงชื่อเข้าใช้ Play Games
    3. บันทึกการเปลี่ยนแปลง
  5. ขณะยังอยู่ในหน้าการกำหนดค่าบริการเกมของ Play ให้คลิก เพิ่มข้อมูลเข้าสู่ระบบอีกครั้ง

    1. เลือกประเภท Android
    2. ในช่องไคลเอ็นต์ OAuth ให้เลือกรหัสไคลเอ็นต์ Android ของโปรเจ็กต์ (ถ้าคุณไม่เห็นรหัสไคลเอ็นต์ของ Android ให้ตรวจสอบว่าได้ตั้งค่ารหัสของเกม ลายนิ้วมือ SHA-1 ในคอนโซล Firebase)
    3. บันทึกการเปลี่ยนแปลง
  6. ในหน้าผู้ทดสอบ ให้เพิ่มอีเมลของผู้ใช้ที่ต้องการ สามารถลงชื่อเข้าใช้เกมของคุณได้ก่อนที่จะเผยแพร่ใน Play Store

ผสานรวมการลงชื่อเข้าใช้ Play Games เข้ากับเกมของคุณ

ขั้นแรก ให้รวมการลงชื่อเข้าใช้ Play Games เข้ากับแอปของคุณ โปรดดู ลงชื่อเข้าใช้ Android Games

ในการผสานรวม เมื่อสร้างออบเจ็กต์ 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 Games ใน คอนโซล Firebase

ตรวจสอบสิทธิ์ด้วย Firebase

หลังจากที่คุณเพิ่มการลงชื่อเข้าใช้ Play Games ลงในแอป คุณจะต้องตั้งค่า Firebase เพื่อใช้ ข้อมูลรับรองบัญชี Google ที่คุณจะได้รับเมื่อผู้เล่นลงชื่อเข้าใช้สำเร็จ ด้วย Play Games

  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 Games แบบเงียบหรือมีการโต้ตอบได้ รับรหัสการให้สิทธิ์จากออบเจ็กต์ 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 Games ของตน บัญชีใหม่นี้จัดเก็บไว้เป็นส่วนหนึ่งของ 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 และกฎความปลอดภัยของ Cloud Storage คุณจะได้รับ รหัสผู้ใช้ที่ไม่ซ้ำกันของผู้ใช้ที่ลงชื่อเข้าใช้จากตัวแปร auth และใช้เพื่อ ควบคุมข้อมูลที่ผู้ใช้เข้าถึงได้

หากต้องการรับข้อมูลผู้เล่น Play Games ของผู้ใช้หรือการเข้าถึงบริการเกมของ Play ใช้ API จาก Google Play Games SDK

หากต้องการนำผู้ใช้ออกจากระบบ โปรดโทรหา FirebaseAuth.signOut()

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();