ตรวจสอบสิทธิ์โดยใช้บริการเกมของ Google Play บน Android

คุณใช้บริการ Google Play Games เพื่อลงชื่อเข้าใช้เกม Android ที่สร้างขึ้นบน Firebase ได้ หากต้องการใช้การลงชื่อเข้าใช้บริการ Google Play Games ด้วย 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 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:33.7.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.3.0")
    }

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

    (วิธีอื่น)  เพิ่มไลบรารี 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.1.0")
    // Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:21.3.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 Auth

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

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

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

กําหนดค่า Play Games services ด้วยข้อมูลแอป Firebase

  1. ในคอนโซล Google Play ให้เปิดแอป Google 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 Games เข้ากับเกม

ก่อนอื่น ให้ผสานรวมการลงชื่อเข้าใช้ Play Games เข้ากับแอปของคุณ ดูวิธีการทั้งหมดได้ที่หัวข้อลงชื่อเข้าใช้ Android Games

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

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

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

  1. ก่อนอื่น ให้รับอินสแตนซ์ที่แชร์ของออบเจ็กต์ FirebaseAuth ในเมธอด onCreate ของกิจกรรมการลงชื่อเข้าใช้ ดังนี้

Kotlin

private lateinit var auth: FirebaseAuth
// ...
// Initialize Firebase Auth
auth = Firebase.auth

Java

private FirebaseAuth mAuth;
// ...
// Initialize Firebase Auth
mAuth = FirebaseAuth.getInstance();
  1. เมื่อเริ่มต้นกิจกรรม ให้ตรวจสอบว่าผู้เล่นลงชื่อเข้าใช้ 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);
}
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

// 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

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 Games ให้ใช้ API ที่ Google Play Games SDK มีให้

หากต้องการออกจากระบบของผู้ใช้ ให้เรียกใช้ FirebaseAuth.signOut() ดังนี้

Kotlin

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();