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

您可以使用 Google Play 游戏服务,使玩家能够登录在 Firebase 和 Unity 上构建的 Android 游戏。要将 Google Play 游戏服务的登录服务用于 Firebase,请首先让玩家登录 Google Play 游戏,并在执行此操作时请求一个 OAuth 2.0 身份验证代码。然后,将此身份验证代码传递给 PlayGamesAuthProvider 以便生成一个 Firebase 凭据,使用此凭据即可进行 Firebase 身份验证。

开始之前

设置 Unity

  1. 按照将 Firebase 添加至您的 Unity 项目指南中的“针对 Android 进行设置”部分所述,将 Firebase SDK 和 Unity SDK 添加到您的 Unity 项目中。

    请务必导入 FirebaseAuth.unitypackage

  2. 在 Unity Editor 中,在 Build Settings > Player Settings > Other Settings 下,设置您的游戏的 Android 软件包名称。

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

设置您的 Firebase 项目

  1. 使用您在 Unity 中设置的软件包名称,从 Firebase 控制台中将您的游戏添加到一个 Firebase 项目中。

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

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

    keytool -exportcert -list -v \
        -alias YOUR-KEY-NAME -keystore PATH-TO-KEYSTORE
    必须使用此密钥签署 APK(在开发期间也需如此)。

  3. 启用 Google Play 游戏作为登录服务提供方:

    1. 找到您的项目的网络服务器客户端 ID 和客户端口令。网络服务器客户端 ID 可向 Google Play 身份验证服务器表明您的 Firebase 项目的身份。

      要找到这些值,请执行以下操作:

      1. Google API 控制台凭据页面中打开您的 Firebase 项目。
      2. OAuth 2.0 客户端 ID (OAuth 2.0 client IDs) 部分中,打开网络客户端(由 Google 服务自动创建)(Web client (auto created by Google Service)) 详细信息页面。此页面会列出您的网络服务器客户端 ID 和口令。
    2. 然后,在 Firebase 控制台中,打开 Authentication(身份验证)部分。

    3. 登录方法标签上,启用 Play 游戏登录服务提供方。您需要指定从 API 控制台中获得的您的项目的网络服务器客户端 ID 和客户端口令。

  1. 打开 Google Play 管理中心,然后点击游戏服务

  2. 点击添加新游戏。在新游戏对话框中,点击我已经在自己的游戏中使用了 Google API,然后在列表中点击您的 Firebase 项目的名称。选择一个游戏类别,然后点击继续进入“游戏详情”页面。

  3. 在“游戏详情”页面的末尾,确保已启用所有必需的 API。

  4. 接下来,打开关联的应用页面并点击 Android。指定您游戏的软件包名称,然后点击保存并继续。管理中心将显示您的 Android 客户端 ID。您可以忽略这个值。

  5. 再次打开关联的应用页面,然后依次点击关联其他应用 > 网页。您将使用此页面来允许 Firebase 身份验证从 Google Play 中检索身份验证令牌。

    启动网址字段中,指定您控制的任意网址,例如使用您的 firebaseapp.com 网域的网址:https://myfirebaseproject-1ac49.firebaseapp.com/。该网址不必是有效的,但您必须指定一个非 localhost 的值。

    接下来,在下一页上点击显示应用并选择,然后选择您的网络服务器客户端 ID。您的网络服务器客户端 ID 将具有一个类似于 https://myfirebaseproject-1ac49.firebaseapp.com/__/auth/handler 的重定向 URI。

  6. 活动成就排行榜页面上,创建您想要在游戏中使用的 Play 游戏资源(如果您不想立即使用,可以先创建一个占位条目)。然后,在任意活动成就排行榜页面上,点击获取资源并将 Android 资源片段复制到合适的位置。您在设置 Google Play 游戏服务插件时需要用到该片段。

    资源片段类似于:

    <?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 商店中发布游戏。

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

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

  2. 将插件的 Unity 软件包导入您的 Unity 项目。您可以在已归档版本的 current-build 目录中找到 Unity 软件包。

  3. 设置 Play 游戏插件:

    1. 依次点击 Window > Google Play Games > Setup > Android Setup,打开 Android Configuration 屏幕。
    2. 将从 Play 管理中心中获取的 Android 资源片段粘贴到 Resources Definition 字段中。
    3. 将您的网络服务器客户端 ID(您在 Firebase 控制台中启用 Play 游戏登录服务时提供的 ID)粘贴到 Client ID 字段中。
    4. 点击 Setup
  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 游戏成功登录后,在登录 Continuation 处理程序中,为该玩家的帐号获取一个身份验证代码:

    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.SignInWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsCanceled) {
        Debug.LogError("SignInWithCredentialAsync was canceled.");
        return;
      }
      if (task.IsFaulted) {
        Debug.LogError("SignInWithCredentialAsync encountered an error: " + task.Exception);
        return;
      }
    
      Firebase.Auth.FirebaseUser newUser = task.Result;
      Debug.LogFormat("User signed in successfully: {0} ({1})",
          newUser.DisplayName, newUser.UserId);
    });
    

后续步骤

用户首次登录后,系统会创建一个新的用户帐号来将该帐号与其 Play 游戏 ID 关联。这个新帐号是作为 Firebase 项目的一部分存储的,可用于在项目中的每个应用中标识用户。

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

Firebase.Auth.FirebaseUser user = auth.CurrentUser;
if (user != null) {
  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,然后用此 ID 来控制用户可以访问哪些数据。

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

要让用户退出登录,可调用 SignOut()

auth.SignOut();

发送以下问题的反馈:

此网页
需要帮助?请访问我们的支持页面