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

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

开始之前

设置您的 Android Studio 项目

  1. 将 Firebase 添加至您的 Android 项目
  2. 将 Firebase 身份验证和 Google Play 服务的依赖项添加到您的应用级 build.gradle 文件:
    implementation 'com.google.firebase:firebase-auth:16.0.3'
    implementation 'com.google.android.gms:play-services-auth:16.0.0'
    

设置您的 Firebase 项目

  1. 从 Firebase 控制台的设置页面设置游戏的 SHA-1 指纹。

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

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

  2. 启用 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. 测试页面上,将所有需要登录您的游戏的用户的电子邮件地址列入白名单,然后在 Play 商店中发布游戏。

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

首先,将 Play 游戏登录服务集成到您的应用中。请参阅登录 Android 游戏了解完整说明。

在集成过程中,当您构建 GoogleSignInOptions 对象时,请使用 DEFAULT_GAMES_SIGN_IN 配置并调用 requestServerAuthCode

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
    .requestServerAuthCode(getString(R.string.default_web_client_id))
    .build();

您必须将您的网络服务器客户端 ID 传递给 requestServerAuthCode 方法。此 ID 就是您在 Firebase 控制台中启用 Play 游戏登录服务时提供的 ID。

进行 Firebase 身份验证

将 Play 游戏登录服务添加到您的应用后,您需要设置 Firebase 以使用您在玩家成功登录 Play 游戏时获取的 Google 帐号凭据。

  1. 首先,在您的登录 Activity 的 onCreate 方法中,获取 FirebaseAuth 对象的共享实例:

    private FirebaseAuth mAuth;
    // ...
    mAuth = FirebaseAuth.getInstance();
    
  2. 初始化您的 Activity 时,请检查玩家是否已通过 Firebase 登录:

    @Override
    public void onStart() {
        super.onStart();
        // Check if user is signed in (non-null) and update UI accordingly.
        FirebaseUser currentUser = mAuth.getCurrentUser();
        updateUI(currentUser);
    }

    如果玩家未登录,请向玩家呈现游戏的退出登录界面,包括用于登录的选项。

  3. 在玩家以静默或交互方式登录 Play 游戏后,从 GoogleSignInAccount 对象中获取身份验证代码,用其换取一个 Firebase 凭据,然后使用该 Firebase 凭据进行 Firebase 身份验证:

    // Call this both in the silent sign-in task's OnCompleteListener and in the
    // Activity's onActivityResult handler.
    private void firebaseAuthWithPlayGames(GoogleSignInAccount acct) {
        Log.d(TAG, "firebaseAuthWithPlayGames:" + acct.getId());
    
        AuthCredential credential = PlayGamesAuthProvider.getCredential(acct.getServerAuthCode());
        mAuth.signInWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            // Sign in success, update UI with the signed-in user's information
                            Log.d(TAG, "signInWithCredential:success");
                            FirebaseUser user = mAuth.getCurrentUser();
                            updateUI(user);
                        } else {
                            // If sign in fails, display a message to the user.
                            Log.w(TAG, "signInWithCredential:failure", task.getException());
                            Toast.makeText(GoogleSignInActivity.this, "Authentication failed.",
                                    Toast.LENGTH_SHORT).show();
                            updateUI(null);
                        }
    
                        // ...
                    }
                });
    }
    

    如果对 signInWithCredential 的调用成功,您便可以使用 getCurrentUser 方法获取用户的帐号数据。

后续步骤

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

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

FirebaseUser user = mAuth.getCurrentUser();
String playerName = user.getDisplayName();

// 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 FirebaseUser.getIdToken() instead.
String uid = user.getUid();

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

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

要让用户退出帐号,请调用 FirebaseAuth.signOut()

FirebaseAuth.getInstance().signOut();

发送以下问题的反馈:

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