Xác thực bằng Dịch vụ trò chơi của Google Play trên Android

Bạn có thể sử dụng Dịch vụ trò chơi của Google Play để đăng nhập người chơi vào một trò chơi Android được xây dựng trên Firebase. Để sử dụng tính năng đăng nhập bằng Dịch vụ trò chơi của Google Play với Firebase, trước tiên, hãy đăng nhập cho người chơi bằng Google Play Games, rồi yêu cầu mã xác thực OAuth 2.0 khi bạn làm như vậy. Sau đó, hãy truyền mã xác thực đến PlayGamesAuthProvider để tạo thông tin xác thực Firebase mà bạn có thể dùng để xác thực bằng Firebase.

Trước khi bắt đầu

Thiết lập dự án Android

  1. Nếu chưa thực hiện, hãy thêm Firebase vào dự án Android.

  2. Trong tệp Gradle (cấp ứng dụng) của mô-đun (thường là <project>/<app-module>/build.gradle.kts hoặc <project>/<app-module>/build.gradle), hãy thêm phần phụ thuộc cho thư viện Firebase Authentication cho Android. Bạn nên sử dụng Firebase Android BoM để kiểm soát việc tạo phiên bản thư viện.

    Ngoài ra, trong quá trình thiết lập Firebase Authentication, bạn cần thêm SDK Dịch vụ Google Play vào ứng dụng của mình.

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

    Bằng cách sử dụng Firebase Android BoM, ứng dụng của bạn sẽ luôn sử dụng những phiên bản tương thích của thư viện Android trên Firebase.

    (Cách khác)  Thêm phần phụ thuộc của thư viện Firebase mà không sử dụng BoM

    Nếu chọn không sử dụng Firebase BoM, bạn phải chỉ định từng phiên bản thư viện Firebase trong dòng phần phụ thuộc của phiên bản đó.

    Xin lưu ý rằng nếu sử dụng nhiều thư viện Firebase trong ứng dụng, bạn nên sử dụng BoM để quản lý các phiên bản thư viện, nhằm đảm bảo rằng tất cả các phiên bản đều tương thích.

    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.0")
    // Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:21.4.0")
    }

Thiết lập dự án Firebase

  1. Đặt vân tay số SHA-1 cho trò chơi của bạn trên trang Settings (Cài đặt) của bảng điều khiển Firebase.

    Bạn có thể lấy hàm băm SHA của chứng chỉ ký bằng lệnh signingReport của gradle:

    ./gradlew signingReport

  2. Bật Google Play Games làm nhà cung cấp dịch vụ đăng nhập:

    1. Tìm mã ứng dụng khách và khoá bí mật của ứng dụng khách trên máy chủ web của dự án. Mã ứng dụng web của máy chủ xác định dự án Firebase của bạn với các máy chủ xác thực Google Play.

      Cách tìm các giá trị này:

      1. Mở dự án Firebase của bạn trong trang thông tin đăng nhập của Bảng điều khiển API Google.
      2. Trong mục Mã ứng dụng OAuth 2.0, hãy mở trang chi tiết Ứng dụng web (do Google Service tự động tạo). Trang này liệt kê mã ứng dụng khách và khoá bí mật của máy chủ web.
    2. Sau đó, trong bảng điều khiển Firebase, hãy mở mục Xác thực.

    3. Trên thẻ Phương thức đăng nhập, hãy bật trình cung cấp dịch vụ đăng nhập Play Games. Bạn sẽ cần chỉ định mã ứng dụng khách và mật khẩu ứng dụng khách của máy chủ web trong dự án mà bạn nhận được từ bảng điều khiển API.

Định cấu hình Play Games services bằng thông tin ứng dụng Firebase của bạn

  1. Trong Google Play Console, hãy mở ứng dụng Google Play hoặc tạo một ứng dụng.

  2. Trong phần Phát triển, hãy nhấp vào Play Games services > Thiết lập và quản lý > Cấu hình.

  3. Nhấp vào Có, trò chơi của tôi đã sử dụng API của Google, chọn dự án Firebase của bạn trong danh sách, rồi nhấp vào Sử dụng.

  4. Trên trang cấu hình Play Games services, hãy nhấp vào Thêm thông tin xác thực.

    1. Chọn loại Máy chủ trò chơi.
    2. Trong trường Ứng dụng khách OAuth, hãy chọn mã ứng dụng web của dự án. Đảm bảo rằng đây là cùng một mã ứng dụng khách mà bạn đã chỉ định khi bật tính năng đăng nhập bằng Play Games.
    3. Lưu thay đổi.
  5. Vẫn ở trên trang cấu hình Play Games services, hãy nhấp lại vào Thêm thông tin xác thực.

    1. Chọn loại Android.
    2. Trong trường Ứng dụng OAuth, hãy chọn mã ứng dụng Android của dự án. (Nếu bạn không thấy mã ứng dụng khách Android, hãy nhớ đặt vân tay SHA-1 của trò chơi trong bảng điều khiển Firebase.)
    3. Lưu thay đổi.
  6. Trên trang Người kiểm thử, hãy thêm địa chỉ email của những người dùng cần có khả năng đăng nhập vào trò chơi của bạn trước khi bạn phát hành trò chơi trên Play Store.

Tích hợp tính năng đăng nhập bằng Play Games vào trò chơi

Trước tiên, hãy tích hợp tính năng đăng nhập bằng Play Games vào ứng dụng của bạn. Hãy xem phần Đăng nhập vào các Trò chơi trên Android để biết hướng dẫn đầy đủ.

Trong quá trình tích hợp, khi bạn tạo đối tượng GoogleSignInOptions, hãy dùng cấu hình DEFAULT_GAMES_SIGN_IN và gọi 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();

Bạn phải truyền mã ứng dụng khách máy chủ web của mình vào phương thức requestServerAuthCode. Đây là mã nhận dạng mà bạn cung cấp khi bật tính năng đăng nhập bằng Play Games trong bảng điều khiển Firebase.

Xác thực bằng Firebase

Sau khi thêm tính năng đăng nhập bằng Play Games vào ứng dụng, bạn cần thiết lập Firebase để sử dụng thông tin đăng nhập tài khoản Google mà bạn nhận được khi người chơi đăng nhập thành công bằng Play Games.

  1. Trước tiên, trong phương thức onCreate của hoạt động đăng nhập, hãy lấy thực thể dùng chung của đối tượng FirebaseAuth:

Kotlin

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

Java

private FirebaseAuth mAuth;
// ...
// Initialize Firebase Auth
mAuth = FirebaseAuth.getInstance();
  1. Khi khởi chạy Hoạt động, hãy kiểm tra xem người chơi đã đăng nhập bằng Firebase hay chưa:

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. Sau khi người chơi đăng nhập bằng Play Games một cách âm thầm hoặc tương tác, hãy lấy mã xác thực từ đối tượng GoogleSignInAccount, đổi mã đó để lấy thông tin đăng nhập Firebase và xác thực bằng Firebase bằng thông tin đăng nhập 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);
                    }

                    // ...
                }
            });
}

Nếu lệnh gọi đến signInWithCredential thành công, bạn có thể dùng phương thức getCurrentUser để lấy dữ liệu tài khoản của người dùng.

Các bước tiếp theo

Sau khi người dùng đăng nhập lần đầu, một tài khoản người dùng mới sẽ được tạo và liên kết với tên nhận dạng Play Games của họ. Tài khoản mới này được lưu trữ trong dự án Firebase của bạn và có thể dùng để xác định một người dùng trên mọi ứng dụng trong dự án của bạn.

Trong trò chơi, bạn có thể lấy UID Firebase của người dùng từ đối tượng 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();

Trong Cơ sở dữ liệu theo thời gian thực của Firebase và Quy tắc bảo mật của Bộ nhớ đám mây, bạn có thể lấy mã nhận dạng người dùng duy nhất của người dùng đã đăng nhập từ biến auth và dùng mã nhận dạng này để kiểm soát dữ liệu mà người dùng có thể truy cập.

Để lấy thông tin về người chơi của người dùng trên Play Games hoặc để truy cập vào các dịch vụ của Play Games, hãy sử dụng các API do Google Play Games SDK cung cấp.

Để đăng xuất người dùng, hãy gọi FirebaseAuth.signOut():

Kotlin

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();