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ụ trò chơi của Google Play để đăng nhập người chơi vào một trò chơi Android được tạo trên Firebase và Unity. Để sử dụng tính năng đăng nhập 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 rồi yêu cầu mã xác thực OAuth 2.0 khi thực hiện việc này. Sau đó, chuyển mã xác thực vào PlayGamesAuthProvider để tạo thông tin xác thực Firebase. Bạn có thể sử dụng mã 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à Firebase Unity SDK vào dự án Unity 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 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 kho khoá và khoá sẽ dùng để ký gói Android của bạn. Bạn phải ký APK của mình để tính năng đăng nhập vào Play Games hoạt động được – yêu cầu này không chỉ áp dụng cho việc phát hành 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 của Firebase, hãy chuyển đến dự án Firebase mà bạn đã đăng ký dự án Unity.

  2. Đặt vân tay số SHA-1 của trò chơi trên trang Cài đặt của bảng điều khiển của Firebase bằng khoá bạn đã thiết lập trong Unity.

    Bạn có thể lấy vân tay số 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 của Gradle:

    gradlew signingReport

    Tệp APK của bạn phải được ký bằng khoá này, kể cả trong quá trình phát triển.

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

    1. Trong bảng điều khiển của Firebase, hãy mở mục Xác thực.

    2. Tạo và lấy 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:

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

      2. Sao chép mã ứng dụng khách của máy chủ web và mã bí mật từ nhà cung cấp dịch vụ đăng nhập 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 rồi chỉ định mã ứng dụng khách máy chủ web của dự án và mật khẩu ứng dụng khách mà bạn nhận được ở bước cuối cùng.

Định cấu hình Dịch vụ trò chơi của Play bằng thông tin ứng dụng trong Firebase

  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 Dịch vụ trò chơi của Play > 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, sau đó nhấp vào Sử dụng.

  4. Trên trang cấu hình Dịch vụ trò chơi của Play, hãy nhấp vào Add Credential (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à mã ứng dụng khách mà bạn đã chỉ định khi bật tính năng đăng nhập vào Play Games.
    3. Lưu thay đổi.
  5. Vẫn trên trang cấu hình Dịch vụ trò chơi của Play, hãy nhấp lại vào Add Credential (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 khách Android của dự án. (Nếu không thấy mã ứng dụng khách Android, hãy đảm bảo bạn đã đặt vân tay số SHA-1 của trò chơi trong bảng điều khiển của 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 sử dụng cho trò chơi của mình (nếu chưa muốn sử dụng ngay bất kỳ tài nguyên nào, 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 ở nơi thuận tiện. Bạn cần có đoạn mã này để thiết lập trình bổ trợ Dịch vụ trò chơi của Google Play.

    Đoạn mã tài nguyên sẽ có dạng như 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 Nhân viên kiểm thử, hãy thêm địa chỉ email của mọi người dùng cần có để có thể đăng nhập vào trò chơi trước khi bạn phát hành trò chơi trên Cửa hàng Play.

Tích hợp tính năng đăng nhập trên 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 bản phát hành này.

  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 Cấu hình Android.
    2. Dán đoạn mã tài nguyên Android 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 của Play Games trong bảng điều khiển của Firebase vào trường Mã ứng dụng khách.
    4. Nhấp vào Setup (Thiết lập).
  4. Trong trò chơi của bạn, hãy định cấu hình một ứng dụng Play Games khi bật chế độ cài đặt RequestServerAuthCode:

    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 thông tin đăng nhập vào Play Games vào trò chơi của mình, bạn có thể sử dụng mã xác thực từ dịch vụ trò chơi của Play để 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ã xác thực 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ã xác thực từ Dịch vụ trò chơi của Play để lấy thông tin xác thực Firebase và sử 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 tiên, một tài khoản người dùng mới sẽ được tạo và 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 trong dự án Firebase của bạn và có thể dùng để xác định người dùng trên mọi ứng dụng trong dự án của bạn.

Trong trò chơi của mình, 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ác Quy tắc bảo mật của Cloud Storage và Cơ sở dữ liệu theo thời gian thực của Firebase, bạn có thể lấy mã nhận dạng người dùng riêng biệt của người dùng đã đăng nhập từ biến auth và sử dụng mã đó để kiểm soát dữ liệu mà người dùng có thể truy cập.

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

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

auth.SignOut();