使用 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();