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

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

    Đảm bảo nhập FirebaseAuth.unitypackage .

  2. Trong Unity Editor, trong Cài đặt bản dựng > Cài đặt trình phát > Cài đặt khác, đặt tên gói Android cho trò chơi của bạn.

  3. Sau đó, trong 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 kho khóa và khóa sẽ được sử dụng để ký gói Android của bạn. APK của bạn phải được đăng nhập để đăng nhập vào Play Trò chơi—yêu cầu này không chỉ áp dụng cho việc xuất bản mà còn áp dụng trong quá trình phát triển trò chơi của bạn.

Thiết lập dự án Firebase của bạn

  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 của mình.

  2. Đặt dấu vân tay SHA-1 cho trò chơi của bạn từ trang Cài đặt của bảng điều khiển Firebase bằng khóa bạn đặt trong Unity.

    Bạn có thể lấy dấu vân tay SHA-1 của khóa 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ý của mình bằng lệnh signingReport cấp độ:

    gradlew signingReport

    APK của bạn phải được ký bằng khóa 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 mở phần Xác thực .

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

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

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

    3. Trong tab Phương thức đăng nhập , hãy bật nhà cung cấp đăng nhập Play Trò chơi và chỉ định ID ứng dụng khách và mã bí mật ứng dụng khách của máy chủ web mà bạn đã nhận được ở bước cuối cùng.

Định cấu hình dịch vụ Play Trò chơi 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 của bạn hoặc tạo một ứng dụng.

  2. Trong phần Phát triển , nhấp vào Dịch vụ Play Trò chơi > Thiết lập & Quản lý > Cấu hình .

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

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

    Đoạn mã tài nguyên trông giố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 Người thử nghiệm , hãy thêm địa chỉ email của bất kỳ người dùng nào 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 cửa hàng Play.

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

  1. Tải xuống bản phát hành mới nhất của plugin Play Trò chơi dành cho Unity và giải nén nó.

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

  3. Thiết lập plugin Play Trò chơi:

    1. Nhấp vào 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 tài nguyên Android bạn nhận được từ Play console vào trường Định nghĩa tài nguyên .
    3. Dán ID ứng dụng khách máy chủ web mà bạn đã cung cấp khi bật đăng nhập Play Trò chơi trong bảng điều khiển Firebase vào trường ID ứng dụng khách .
    4. Nhấp vào Cài đặt .
  4. Trong trò chơi của bạn, hãy định cấu hình ứng dụng khách Play Trò chơi có bật 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 với Firebase

Sau khi thêm thông tin đăng nhập Play Trò chơi 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ụ Play Trò chơi để 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 đó, đổi mã xác thực từ các dịch vụ của Play Trò chơi để lấy thông tin xác thực Firebase 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);
    });
    

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

Để nhận thông tin người chơi Play Trò chơi của người dùng hoặc để truy cập các dịch vụ của Play Trò chơi, hãy sử dụng API do plugin Play Trò chơi cung cấp.

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

auth.SignOut();