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 trò chơi Android tạo dựa trên Firebase và Unity. Cách đăng nhập bằng Dịch vụ trò chơi của Google Play 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ột Mã xác thực OAuth 2.0 khi bạn làm vậy. Sau đó, chuyển mã uỷ quyền cho PlayGamesAuthProvider để tạo thông tin đăng nhập Firebase mà bạn có thể sử dụng để 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 Unity Firebase vào dự án Unity như được mô tả trong 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, ở mục Build Settings > (Cài đặt bản dựng >) Cài đặt trình phát > Lý do khác Cài đặt đặt tên gói Android cho trò chơi của bạn.

  3. Sau đó, trong Build Settings > (Cài đặt bản dựng >) Cài đặt trình phát > Cài đặt xuất bản, chọn hoặc tạo một kho khoá và khoá dùng để ký thiết bị 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 là cách 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 của bạn.

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 nơi bạn đăng ký dự án Unity.

  2. Đặ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, sử dụng khoá bạn đã đặt 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 hàm lệnh signingReport 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. Cho phép 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 mở Authentication.

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

      1. Trong thẻ Phương thức đăng nhập, hãy bật tính năng đăng nhập của Google Google Cloud.

      2. Sao chép mã ứng dụng khách của máy chủ web và mã bí mật trong phiên đăng nhập bằng Google Google Cloud.

    3. Trong thẻ Phương thức đăng nhập, hãy bật Play Games nhà cung cấp dịch vụ đăng nhập và chỉ định mã ứng dụng khách của 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 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 các trang Sự kiện, Thành tíchBảng xếp hạng, hãy tạo bất kỳ Play Games tài nguyên bạn muốn sử dụng trong trò chơi (nếu bạn chưa muốn sử dụng bất kỳ mục nào ngay lập tức, bạn có thể tạo một mục nhập phần giữ chỗ). Sau đó, bật 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 Lấy tài nguyên rồi sao chép đoạn mã tài nguyên Android ở một nơi nào đó thuận tiện. Bạn cần có đoạn mã để thiết lập Google Play Games services .

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

  1. Tải bản phát hành mới nhất của Trình bổ trợ Play Games cho Unity và giải né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 > (Cửa sổ >) Google Play Games > Thiết lập > Android Setup (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 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 Đăng nhập Play Games trong bảng điều khiển Firebase vào 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 ứng dụng Play Games bằng RequestServerAuthCode bật chế độ cài đặ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 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 bước đăng nhập trình xử lý tiếp tục, lấy mã xác thực cho tài khoản 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 cho Firebase thông tin xác thực và sử dụng thông tin xác thực 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à 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ừ Đố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 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, hãy dùng 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();