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 trò chơi Android tạo dựa trên Firebase. Cách đăng nhập bằng dịch vụ Google Play Games bằng Firebase: trước tiên, hãy đăng nhập người chơi bằng Google Play Games, sau đó yêu cầu xác thực OAuth 2.0 khi bạn làm như vậy. Sau đó, chuyển mã uỷ quyền vào PlayGamesAuthProvider để tạo thông tin đăng nhập Firebase mà bạn có thể sử dụng để xác thực với Firebase.

Trước khi bắt đầu

Thiết lập dự án Android

  1. Nếu bạn chưa làm như vậy, thêm Firebase vào dự án Android của bạn.

  2. Trong tệp Gradle mô-đun (cấp ứng dụng) (thường là <project>/<app-module>/build.gradle.kts hoặc <project>/<app-module>/build.gradle), 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 thuộc tính 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:33.5.1"))
    
        // 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")
    }

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

    (Phương án thay thế) Thêm các 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ụ thuộc.

    Lưu ý rằng nếu bạn sử dụng nhiều thư viện Firebase trong ứng dụng của mình, bạn nên sử dụng BoM để quản lý các phiên bản thư viện. Việc này đả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: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.2.0")
    }
    Bạn đang tìm một mô-đun thư viện dành riêng cho Kotlin? Bắt đầu sau Tháng 10 năm 2023 (Firebase BoM 32.5.0), cả nhà phát triển Kotlin và Java đều có thể phụ thuộc vào mô-đun thư viện chính (để biết thông tin chi tiết, hãy xem Câu hỏi thường gặp về sáng kiến này).

Thiết lập dự án Firebase

  1. Đặt vân tay SHA-1 của trò chơi trên Trang 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 gradle Lệnh signingReport:

    ./gradlew signingReport

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

    1. Tìm mã ứng dụng khách của máy chủ web và mật khẩu ứng dụng khách của dự án. Web mã ứng dụng khách của máy chủ xác định dự án Firebase của bạn cho Google Play máy chủ xác thực.

      Cách tìm những giá trị này:

      1. Mở dự án Firebase trên trang thông tin đăng nhập Bảng điều khiển API của Google.
      2. Trong phần Mã ứng dụng khách OAuth 2.0, mở Ứng dụng web (tự động do dịch vụ của Google tạo). Trang này liệt kê thông tin web của bạn mã ứng dụng khách của máy chủ.
    2. Sau đó, trong bảng điều khiển của 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 tính năng đăng nhập vào Play Games Google Cloud. Bạn sẽ cần chỉ định máy chủ web của dự án Client-ID và mật khẩu ứng dụng khách 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 Bảng điều khiển Google Play, hãy mở ứng dụng Google Play của bạn 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, hãy chọn Firebase dự án từ danh sách, rồi nhấp vào Use (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 OAuth, hãy chọn mã ứng dụng web của dự án. Hãy đảm bảo đây chính là ID ứng dụng khách bạn đã chỉ định khi bật Đăng nhập Play Games.
    3. Lưu thay đổi.
  5. Vẫn trên trang cấu hình Play Games services, nhấp vào Thêm lại 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 khách Android của dự án. (Nếu bạn không thấy ID ứng dụng khách Android của mình, hãy đảm bảo bạn đã đặt Vân tay số SHA-1 trong bảng điều khiển Firebase.)
    3. Lưu thay đổi.
  6. Trên trang Nhân viên kiểm thử, hãy thêm địa chỉ email của tất cả những người dùng cần đăng nhập vào trò chơi của bạn trước khi phát hành trên Play Store.

Tích hợp tính năng đăng nhập trên Play Games vào trò chơi của bạn

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

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

Bạn phải truyền mã ứng dụng khách của máy chủ web đến 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 vào Play Games trong Bảng điều khiển Firebase.

Xác thực bằng Firebase

Sau khi thêm thông tin đăng nhập vào Play Games vào ứng dụng của mình, 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 với 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 phương thức thực thể dùng chung của đối tượng 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. Khi khởi tạo Hoạt động, hãy kiểm tra xem người chơi đã ký hay chưa bằng 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. Sau khi người chơi đăng nhập vào Play Games theo cách âm thanh hoặc tương tác, lấy mã xác thực từ đối tượng GoogleSignInAccount, đổi lấy mã thông tin đăng nhập Firebase và xác thực bằng Firebase bằng Firebase thông tin xác thực:

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);
                    }

                    // ...
                }
            });
}

Nếu lệnh gọi đến signInWithCredential thành công, bạn có thể sử 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 tiên, một tài khoản người dùng mới sẽ được tạo và có liên kết với mã nhận dạng Play Games của họ. Tài khoản mới này được lưu trữ như một phần của dự án Firebase và có thể được dùng để xác định người dùng trên mọi ứng dụng trong dự án.

Trong trò chơi của mình, bạn có thể lấy UID Firebase của người dùng từ FirebaseUser đối tượng:

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();

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 Cloud Storage, bạn có thể nhận được 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 rồi sử dụng mã đó để kiểm soát loại dữ liệu mà người dùng có thể truy cập.

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

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

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();