使用 Google Play 游戏服务进行身份验证 (Unity)

您可以使用 Google Play 游戏服务,使玩家能够登录在 Firebase 和 Unity 基础上构建的 Android 游戏。要搭配 Firebase 使用 Google Play 游戏服务的登录机制,请首先让玩家登录 Google Play 游戏,并同时申请一个 OAuth 2.0 身份验证代码。然后,将此身份验证代码传递给 PlayGamesAuthProvider 以生成一个 Firebase 凭据,您可以使用该凭据进行 Firebase 身份验证。

准备工作

设置您的 Unity 项目

  1. 将 Firebase 配置文件和 Firebase Unity SDK 添加到 Unity 项目中(如将 Firebase 添加到 Unity 项目中所述)。按照适用于 Android 的说明操作。

    请务必导入 FirebaseAuth.unitypackage。

  2. 在 Unity Editor 中,在 Build Settings(构建设置)> Player Settings(玩家设置)> Other Settings (其他设置) 下,设置游戏的 Android 软件包名称。

  3. 然后,在 Build Settings(构建设置)> Player Settings(玩家设置)> Publishing Settings(发布设置) 下,选择或创建一个密钥库和密钥,它们将用于签署您的 Android 软件包。要让 Play 游戏登录机制正常发挥作用,必须签署 APK。此要求不仅适用于游戏发布阶段,也适用于游戏开发阶段。

设置您的 Firebase 项目

  1. 在 Firebase 控制台中,前往您在其中注册了 Unity 项目的 Firebase 项目。

  2. 使用您在 Unity 中设置的密钥,在 Firebase 控制台的设置页面中设置游戏的 SHA-1 指纹。

    您可以使用 keytool 命令获取您的密钥的 SHA-1 指纹:

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

    或者,您也可以使用 Gradle signingReport 命令获取签名证书的 SHA 哈希值:

    gradlew signingReport

    必须使用此密钥签署 APK(开发期间也是如此)。

  3. 启用 Google Play Games 作为登录提供方:

    1. 在 Firebase 控制台中,打开 Authentication 部分。

    2. 生成并获取您项目的 Web 服务器客户端 ID 和客户端密钥:

      1. 在登录方法标签页中,启用 Google 登录提供方。

      2. 从 Google 登录提供方复制 Web 服务器客户端 ID 和密钥。

    3. 在登录方法标签页中,启用 Play Games 登录提供方,然后指定您项目的 Web 服务器客户端 ID 和客户端密钥(即您在上一步复制的内容)。

根据 Firebase 应用信息配置 Play Games services

  1. 在 Google Play 控制台中,打开您的 Google Play 应用或创建一个应用。

  2. 在“拓展”部分中,依次点击 Play Games services > 设置和管理 > 配置。

  3. 点击是,我的游戏已经使用了 Google API,从列表中选择您的 Firebase 项目,然后点击使用。

  4. 在 Play Games services配置页面上,点击添加凭据。

    1. 选择游戏服务器类型。
    2. 在 OAuth 客户端字段中,选择您的项目的 Web 客户端 ID。请确保此 ID 就是您在启用 Play Games 登录时指定的客户端 ID。
    3. 保存更改。
  5. 仍然是在 Play Games services配置页面上,再次点击添加凭据。

    1. 选择 Android 类型。
    2. 在 OAuth 客户端字段中,选择项目的 Android 客户端 ID。(如果您没有看到自己的 Android 客户端 ID,请务必在 Firebase 控制台中设置游戏的 SHA-1 指纹。)
    3. 保存更改。
  6. 在活动、成就和排行榜页面上,创建您想要在游戏中使用的任何 Play Games 资源(如果您不想立即使用任何资源,可以先创建一个占位条目)。然后,在任意活动、成就或排行榜页面上,点击获取资源并将 Android 资源片段复制到合适的位置。您在设置 Google Play Games services插件时需要用到该片段。

    资源代码段类似于以下示例:

    <?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. 在测试人员页面上,添加所有需要能够登录该游戏的用户的电子邮件地址,然后再将游戏发布到 Play Store。

将 Play 游戏登录服务集成到您的游戏中

  1. 下载最新版适用于 Unity 的 Play 游戏插件并将其解压。

  2. 将插件的 Unity 软件包导入您的 Unity 项目。您可以在压缩包的 current-build 目录中找到 Unity 软件包。

  3. 设置 Play 游戏插件:

    1. 依次点击 Window(窗口)> Google Play Games(Google Play 游戏)> Setup(设置)> Android Setup (Android 设置),打开 Android Configuration(Android 配置)界面。
    2. 将来自 Play 管理中心的 Android 资源代码段粘贴到 Resources Definition(资源定义)字段中。
    3. 将 Web 服务器客户端 ID(您在 Firebase 控制台中启用 Play Games 登录时提供的 ID)粘贴到客户端 ID 字段中。
    4. 点击设置。
  4. 在您的游戏中,配置一个启用了 RequestServerAuthCode 设置的 Play 游戏客户端:

    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. 然后,当玩家选择使用 Play 游戏服务登录时,调用 Social.localUser.Authenticate():

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

进行 Firebase 身份验证

将 Play 游戏登录服务添加到您的游戏后,您可以使用 Play 游戏服务提供的身份验证代码进行 Firebase 身份验证。

  1. 玩家使用 Play 游戏成功登录后,在登录接续处理程序中,为该玩家的账号获取一个身份验证代码:

    Social.localUser.Authenticate((bool success) => {
      if (success) {
        authCode = PlayGamesPlatform.Instance.GetServerAuthCode();
      }
    });
    
  2. 然后,用 Play 游戏服务提供的身份验证代码换取一个 Firebase 凭据,并使用该 Firebase 凭据来对该玩家进行身份验证:

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

后续步骤

用户首次登录后,系统会创建一个新的用户账号,并将该账号与其 Play 游戏 ID 关联。这个新账号归属于您的 Firebase 项目,可用于在该项目中的每个应用中标识用户。

在您的游戏中,您可以从 Firebase.Auth.FirebaseUser 对象获取用户的 Firebase UID:

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

在您的 Firebase 实时数据库和 Cloud Storage 安全规则中,您可以从 auth 变量获取已登录用户的唯一用户 ID,然后用其控制用户可以访问哪些数据。

要获取用户的 Play 游戏玩家信息或访问 Play 游戏服务,请使用 Play 游戏插件提供的 API。

如需让用户退出登录,请调用 SignOut():

auth.SignOut();