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

Bạn có thể sử dụng Dịch vụ Google Play Games để đăng nhập người chơi vào một trò chơi Android được xây dựng trên Firebase và Unity. Để 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 người chơi bằng Google Play Games, rồi yêu cầu mã uỷ quyền OAuth 2.0 khi bạn làm như vậy. Sau đó, hãy truyền mã uỷ quyền đến PlayGamesAuthProvider để tạo thông tin xác thực Firebase. Bạn có thể dùng thông tin xác thực này để xác thực bằng Firebase.

Trước khi bắt đầu

Thiết lập dự án Unity

  1. Thêm tệp cấu hình Firebase và SDK Firebase Unity vào dự án Unity của bạn như mô tả trong phần Thêm Firebase vào dự án Unity. Làm theo hướng dẫn dành cho Android.

    Hãy nhớ nhập FirebaseAuth.unitypackage.

  2. Trong Trình chỉnh sửa Unity, trong phần Build Settings > Player Settings > Other Settings (Cài đặt bản dựng > Cài đặt trình phát > Cài đặt khác), hãy đặt tên gói Android cho trò chơi của bạn.

  3. Sau đó, trong phần Build Settings > Player Settings > Publishing Settings (Cài đặt bản dựng > Cài đặt trình phát > Cài đặt xuất bản), hãy chọn hoặc tạo một kho khoá và khoá sẽ được dùng để ký gói Android của bạn. Bạn phải ký APK để tính năng đăng nhập bằng Play Games hoạt động. Yêu cầu này không chỉ áp dụng cho việc xuất bản mà còn trong quá trình phát triển trò chơi.

Thiết lập dự án Firebase

  1. Trong bảng điều khiển Firebase, hãy chuyển đến dự án Firebase mà bạn đã đăng ký dự án Unity.

  2. Chỉ định dấu vân tay SHA-1 của trò chơi.

    1. Trong bảng điều khiển Firebase, hãy chuyển đến thẻ Cài đặt > Chung.

    2. Di chuyển xuống thẻ Ứng dụng của bạn, chọn ứng dụng Android của bạn rồi thêm dấu vân tay SHA-1 vào trường Dấu vân tay chứng chỉ SHA.

    Bạn có thể lấy vân tay SHA-1 của khoá bằng lệnh keytool:

    keytool -exportcert -list -v \
        -alias YOUR-KEY-NAME -keystore PATH-TO-KEYSTORE

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

    gradlew signingReport

    Hãy xem phần Xác thực ứng dụng của bạn để biết thông tin chi tiết về cách lấy dấu vân tay SHA của ứng dụng.

    Bạn phải ký APK bằng khoá này, kể cả trong quá trình phát triển.

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

    1. Trong bảng điều khiển Firebase, hãy chuyển đến phần Bảo mật > Xác thực.

    2. Tạo và lấy mã ứng dụng khách máy chủ web và khoá bí mật của ứng dụng cho dự án:

      1. Trong thẻ Phương thức đăng nhập, hãy bật trình cung cấp dịch vụ đăng nhập Google.

      2. Sao chép mã ứng dụng khách và khoá bí mật của máy chủ web từ trình cung cấp dịch vụ đăng nhập bằng Google.

    3. Trong 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, đồng thời 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 ở bước cuối cùng.

Đị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 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 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 Android, hãy nhớ đặt vân tay số SHA-1 của trò chơi trong bảng điều khiển Firebase.)
    3. Lưu thay đổi.
  6. Trên các trang Sự kiện, Thành tíchBảng xếp hạng, hãy tạo mọi tài nguyên Play Games mà bạn muốn dùng với trò chơi của mình (nếu không muốn dùng ngay, bạn có thể tạo một mục giữ chỗ). Sau đó, trên bất kỳ trang Sự kiện, Thành tích hoặc Bảng xếp hạng nào, hãy nhấp vào Nhận tài nguyên rồi sao chép đoạn mã tài nguyên Android vào một nơi thuận tiện. Bạn sẽ cần đoạn mã này để thiết lập trình bổ trợ Google Play Games services.

    Đoạn mã tài nguyên sẽ có dạng như trong ví dụ sau:

    <?xml version="1.0" encoding="utf-8"?>
    <!--
    Google Play game services IDs.
    Save this file as res/values/games-ids.xml in your project.
    -->
    <resources>
      <!-- app_id -->
      <string name="app_id" translatable="false">123456789000</string>
      <!-- package_name -->
      <string name="package_name" translatable="false">com.example.game</string>
      <!-- event Wiped Raid -->
      <string name="event_wiped_raid" translatable="false">CgkIpKjv1a4PEAIYBA</string>
    </resources>
    
  7. 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 của bạn

  1. Tải bản phát hành mới nhất của trình bổ trợ Play Games cho Unity xuống rồi giải nén.

  2. Nhập gói Unity của trình bổ trợ vào dự án Unity. Bạn có thể tìm thấy gói Unity trong thư mục current-build của kho lưu trữ bản phát hành.

  3. Thiết lập trình bổ trợ Play Games:

    1. Nhấp vào Window > Google Play Games > Setup > Android Setup (Cửa sổ > Google Play Games > Thiết lập > Thiết lập Android) để mở màn hình Android Configuration (Cấu hình Android).
    2. Dán đoạn mã tài nguyên Android mà bạn nhận được từ Play Console vào trường Resources Definition (Định nghĩa tài nguyên).
    3. Dán mã ứng dụng khách của máy chủ web 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 vào trường Mã ứng dụng khách.
    4. Nhấp vào Thiết lập.
  4. Trong trò chơi, hãy định cấu hình một ứng dụng Play Games có chế độ cài đặt RequestServerAuthCode được bật:

    using GooglePlayGames;
    using GooglePlayGames.BasicApi;
    using UnityEngine.SocialPlatforms;
    using System.Threading.Tasks;
    
    PlayGamesClientConfiguration config = new PlayGamesClientConfiguration.Builder()
        .RequestServerAuthCode(false /* Don't force refresh */)
        .Build();
    
    PlayGamesPlatform.InitializeInstance(config);
    PlayGamesPlatform.Activate();
    
  5. Sau đó, khi người chơi chọn đăng nhập bằng Play Games, hãy gọi Social.localUser.Authenticate():

    Social.localUser.Authenticate((bool success) => {
      // handle success or failure
    });
    

Xác thực bằng Firebase

Sau khi thêm dịch vụ đăng nhập bằng Play Games vào trò chơi, bạn có thể dùng mã uỷ quyền của dịch vụ Play Games để xác thực bằng Firebase.

  1. Sau khi người chơi đăng nhập thành công bằng Play Games, trong trình xử lý tiếp tục đăng nhập, hãy lấy mã uỷ quyền cho tài khoản của người chơi:

    Social.localUser.Authenticate((bool success) => {
      if (success) {
        authCode = PlayGamesPlatform.Instance.GetServerAuthCode();
      }
    });
    
  2. Sau đó, hãy trao đổi mã uỷ quyền từ dịch vụ trò chơi của Play để lấy thông tin đăng nhập Firebase và dùng thông tin đăng nhập Firebase để xác thực người chơi:

    Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
    Firebase.Auth.Credential credential =
        Firebase.Auth.PlayGamesAuthProvider.GetCredential(authCode);
    auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsCanceled) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync was canceled.");
        return;
      }
      if (task.IsFaulted) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync encountered an error: " + task.Exception);
        return;
      }
    
      Firebase.Auth.AuthResult result = task.Result;
      Debug.LogFormat("User signed in successfully: {0} ({1})",
          result.User.DisplayName, result.User.UserId);
    });
    

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 Firebase.Auth.FirebaseUser:

Firebase.Auth.FirebaseUser user = auth.CurrentUser;
if (user != null && user.IsValid()) {
  string playerName = user.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 User.TokenAsync() instead.
  string uid = user.UserId;
}

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 người chơi Play Games của người dùng 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 trình bổ trợ Play Games cung cấp.

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

auth.SignOut();