获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

在 Android 上使用 Google Play 游戏服务进行身份验证

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

您可以使用 Google Play 游戏服务让玩家登录基于 Firebase 构建的 Android 游戏。要通过 Firebase 使用 Google Play Games 服务登录,请先使用 Google Play Games 登录玩家,并在执行此操作时请求 OAuth 2.0 身份验证代码。然后,将身份验证代码传递给PlayGamesAuthProvider以生成 Firebase 凭据,您可以使用该凭据向 Firebase 进行身份验证。

在你开始之前

设置您的 Android 项目

  1. 如果您还没有,请将 Firebase 添加到您的 Android 项目中。

  2. 在您的模块(应用级)Gradle 文件(通常是<project>/<app-module>/build.gradle )中,添加 Firebase Authentication Android 库的依赖项。我们建议使用Firebase Android BoM来控制库版本控制。

    此外,作为设置 Firebase 身份验证的一部分,您需要将 Google Play 服务 SDK 添加到您的应用中。

    Java

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:31.1.0')
    
        // Add the dependency for the Firebase Authentication library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-auth'
    // Also add the dependency for the Google Play services library and specify its version implementation 'com.google.android.gms:play-services-auth:20.4.0'
    }

    通过使用Firebase Android BoM ,您的应用将始终使用兼容版本的 Firebase Android 库。

    (替代)使用 BoM 的情况下添加 Firebase 库依赖项

    如果您选择不使用 Firebase BoM,则必须在其依赖行中指定每个 Firebase 库版本。

    请注意,如果您在应用中使用多个Firebase 库,我们强烈建议您使用 BoM 来管理库版本,以确保所有版本都兼容。

    dependencies {
        // Add the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-auth:21.1.0'
    // Also add the dependency for the Google Play services library and specify its version implementation 'com.google.android.gms:play-services-auth:20.4.0'
    }

    Kotlin+KTX

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:31.1.0')
    
        // Add the dependency for the Firebase Authentication library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-auth-ktx'
    // Also add the dependency for the Google Play services library and specify its version implementation 'com.google.android.gms:play-services-auth:20.4.0'
    }

    通过使用Firebase Android BoM ,您的应用将始终使用兼容版本的 Firebase Android 库。

    (替代)使用 BoM 的情况下添加 Firebase 库依赖项

    如果您选择不使用 Firebase BoM,则必须在其依赖行中指定每个 Firebase 库版本。

    请注意,如果您在应用中使用多个Firebase 库,我们强烈建议您使用 BoM 来管理库版本,以确保所有版本都兼容。

    dependencies {
        // Add the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-auth-ktx:21.1.0'
    // Also add the dependency for the Google Play services library and specify its version implementation 'com.google.android.gms:play-services-auth:20.4.0'
    }

设置您的 Firebase 项目

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

    您可以使用 gradle signingReport命令获取签名证书的 SHA 哈希:

    ./gradlew signingReport

  2. 启用 Google Play Games 作为登录提供商:

    1. 查找项目的 Web 服务器客户端 ID 和客户端密码。 Web 服务器客户端 ID 向 Google Play 身份验证服务器标识您的 Firebase 项目。

      要找到这些值:

      1. Google API 控制台凭据页面中打开您的 Firebase 项目。
      2. OAuth 2.0 客户端 ID部分中,打开Web 客户端(由 Google 服务自动创建)详细信息页面。此页面列出了您的 Web 服务器客户端 ID 和密码。
    2. 然后,在Firebase 控制台中,打开身份验证部分。

    3. 登录方法选项卡上,启用Play Games登录提供程序。您需要指定您从 API 控制台获得的项目的 Web 服务器客户端 ID 和客户端密码。

使用您的 Firebase 应用信息配置 Play 游戏服务

  1. Google Play Console中,打开您的 Google Play 应用程序或创建一个。

  2. 在“发展”部分中,单击Play 游戏服务 > 设置和管理 > 配置

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

  4. 在 Play 游戏服务配置页面上,单击添加凭据

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

    1. 选择安卓类型。
    2. OAuth 客户端字段中,选择您项目的 Android 客户端 ID。 (如果您没有看到您的 Android 客户端 ID,请确保您在 Firebase 控制台中设置了游戏的 SHA-1 指纹。)
    3. 保存您的更改。
  6. 在“测试人员”页面上,添加需要能够在您的游戏发布到 Play 商店之前登录到您的游戏的任何用户的电子邮件地址。

将 Play 游戏登录功能集成到您的游戏中

首先,将 Play 游戏登录功能集成到您的应用中。有关完整说明,请参阅登录 Android 游戏

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

Java

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

Kotlin+KTX

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

您必须将 Web 服务器客户端 ID 传递给requestServerAuthCode方法。这是您在 Firebase 控制台中启用 Play Games 登录时提供的 ID。

使用 Firebase 进行身份验证

将 Play Games 登录添加到您的应用后,您需要将 Firebase 设置为使用您在玩家通过 Play Games 成功登录时获得的 Google 帐户凭据。

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

Java

private FirebaseAuth mAuth;
// ...
// Initialize Firebase Auth
mAuth = FirebaseAuth.getInstance();

Kotlin+KTX

private lateinit var auth: FirebaseAuth
// ...
// Initialize Firebase Auth
auth = Firebase.auth
  1. 初始化 Activity 时,检查播放器是否已使用 Firebase 登录:

Java

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

Kotlin+KTX

override fun onStart() {
    super.onStart()
    // Check if user is signed in (non-null) and update UI accordingly.
    val currentUser = auth.currentUser
    updateUI(currentUser)
}
If the player isn't signed in, present the player with your game's
signed-out experience, including the option to sign in.
  1. 在玩家以静默方式或交互方式登录 Play 游戏后,从GoogleSignInAccount对象获取身份验证代码,将其交换为 Firebase 凭据,然后使用 Firebase 凭据向 Firebase 进行身份验证:

Java

// 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());

    final FirebaseAuth auth = FirebaseAuth.getInstance();
    AuthCredential credential = PlayGamesAuthProvider.getCredential(acct.getServerAuthCode());
    auth.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 = auth.getCurrentUser();
                        updateUI(user);
                    } else {
                        // If sign in fails, display a message to the user.
                        Log.w(TAG, "signInWithCredential:failure", task.getException());
                        Toast.makeText(MainActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                        updateUI(null);
                    }

                    // ...
                }
            });
}

Kotlin+KTX

// Call this both in the silent sign-in task's OnCompleteListener and in the
// Activity's onActivityResult handler.
private fun firebaseAuthWithPlayGames(acct: GoogleSignInAccount) {
    Log.d(TAG, "firebaseAuthWithPlayGames:" + acct.id!!)

    val auth = Firebase.auth
    val credential = PlayGamesAuthProvider.getCredential(acct.serverAuthCode!!)
    auth.signInWithCredential(credential)
            .addOnCompleteListener(this) { task ->
                if (task.isSuccessful) {
                    // Sign in success, update UI with the signed-in user's information
                    Log.d(TAG, "signInWithCredential:success")
                    val user = auth.currentUser
                    updateUI(user)
                } else {
                    // If sign in fails, display a message to the user.
                    Log.w(TAG, "signInWithCredential:failure", task.exception)
                    Toast.makeText(baseContext, "Authentication failed.",
                            Toast.LENGTH_SHORT).show()
                    updateUI(null)
                }

                // ...
            }
}

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

下一步

用户首次登录后,系统会创建一个新用户帐户并将其关联到他们的 Play 游戏 ID。这个新帐户存储为 Firebase 项目的一部分,可用于在项目中的每个应用中识别用户。

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

Java

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

Kotlin+KTX

val user = auth.currentUser
user?.let {
    val 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 FirebaseUser.getIdToken() instead.
    val uid = user.uid
}

在您的 Firebase 实时数据库和云存储安全规则中,您可以从auth变量中获取登录用户的唯一用户 ID,并使用它来控制用户可以访问哪些数据。

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

要注销用户,请调用FirebaseAuth.signOut()

Java

FirebaseAuth.getInstance().signOut();

Kotlin+KTX

Firebase.auth.signOut()
,

您可以使用 Google Play 游戏服务让玩家登录基于 Firebase 构建的 Android 游戏。要通过 Firebase 使用 Google Play Games 服务登录,请先使用 Google Play Games 登录玩家,并在执行此操作时请求 OAuth 2.0 身份验证代码。然后,将身份验证代码传递给PlayGamesAuthProvider以生成 Firebase 凭据,您可以使用该凭据向 Firebase 进行身份验证。

在你开始之前

设置您的 Android 项目

  1. 如果您还没有,请将 Firebase 添加到您的 Android 项目中。

  2. 在您的模块(应用级)Gradle 文件(通常是<project>/<app-module>/build.gradle )中,添加 Firebase Authentication Android 库的依赖项。我们建议使用Firebase Android BoM来控制库版本控制。

    此外,作为设置 Firebase 身份验证的一部分,您需要将 Google Play 服务 SDK 添加到您的应用中。

    Java

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:31.1.0')
    
        // Add the dependency for the Firebase Authentication library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-auth'
    // Also add the dependency for the Google Play services library and specify its version implementation 'com.google.android.gms:play-services-auth:20.4.0'
    }

    通过使用Firebase Android BoM ,您的应用将始终使用兼容版本的 Firebase Android 库。

    (替代)使用 BoM 的情况下添加 Firebase 库依赖项

    如果您选择不使用 Firebase BoM,则必须在其依赖行中指定每个 Firebase 库版本。

    请注意,如果您在应用中使用多个Firebase 库,我们强烈建议您使用 BoM 来管理库版本,以确保所有版本都兼容。

    dependencies {
        // Add the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-auth:21.1.0'
    // Also add the dependency for the Google Play services library and specify its version implementation 'com.google.android.gms:play-services-auth:20.4.0'
    }

    Kotlin+KTX

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:31.1.0')
    
        // Add the dependency for the Firebase Authentication library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-auth-ktx'
    // Also add the dependency for the Google Play services library and specify its version implementation 'com.google.android.gms:play-services-auth:20.4.0'
    }

    通过使用Firebase Android BoM ,您的应用将始终使用兼容版本的 Firebase Android 库。

    (替代)使用 BoM 的情况下添加 Firebase 库依赖项

    如果您选择不使用 Firebase BoM,则必须在其依赖行中指定每个 Firebase 库版本。

    请注意,如果您在应用中使用多个Firebase 库,我们强烈建议您使用 BoM 来管理库版本,以确保所有版本都兼容。

    dependencies {
        // Add the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-auth-ktx:21.1.0'
    // Also add the dependency for the Google Play services library and specify its version implementation 'com.google.android.gms:play-services-auth:20.4.0'
    }

设置您的 Firebase 项目

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

    您可以使用 gradle signingReport命令获取签名证书的 SHA 哈希:

    ./gradlew signingReport

  2. 启用 Google Play Games 作为登录提供商:

    1. 查找项目的 Web 服务器客户端 ID 和客户端密码。 Web 服务器客户端 ID 向 Google Play 身份验证服务器标识您的 Firebase 项目。

      要找到这些值:

      1. Google API 控制台凭据页面中打开您的 Firebase 项目。
      2. OAuth 2.0 客户端 ID部分中,打开Web 客户端(由 Google 服务自动创建)详细信息页面。此页面列出了您的 Web 服务器客户端 ID 和密码。
    2. 然后,在Firebase 控制台中,打开身份验证部分。

    3. 登录方法选项卡上,启用Play Games登录提供程序。您需要指定您从 API 控制台获得的项目的 Web 服务器客户端 ID 和客户端密码。

使用您的 Firebase 应用信息配置 Play 游戏服务

  1. Google Play Console中,打开您的 Google Play 应用程序或创建一个。

  2. 在“发展”部分中,单击Play 游戏服务 > 设置和管理 > 配置

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

  4. 在 Play 游戏服务配置页面上,单击添加凭据

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

    1. 选择安卓类型。
    2. OAuth 客户端字段中,选择您项目的 Android 客户端 ID。 (如果您没有看到您的 Android 客户端 ID,请确保您在 Firebase 控制台中设置了游戏的 SHA-1 指纹。)
    3. 保存您的更改。
  6. 在“测试人员”页面上,添加需要能够在您的游戏发布到 Play 商店之前登录到您的游戏的任何用户的电子邮件地址。

将 Play 游戏登录功能集成到您的游戏中

首先,将 Play 游戏登录功能集成到您的应用中。有关完整说明,请参阅登录 Android 游戏

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

Java

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

Kotlin+KTX

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

您必须将 Web 服务器客户端 ID 传递给requestServerAuthCode方法。这是您在 Firebase 控制台中启用 Play Games 登录时提供的 ID。

使用 Firebase 进行身份验证

将 Play Games 登录添加到您的应用后,您需要将 Firebase 设置为使用您在玩家通过 Play Games 成功登录时获得的 Google 帐户凭据。

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

Java

private FirebaseAuth mAuth;
// ...
// Initialize Firebase Auth
mAuth = FirebaseAuth.getInstance();

Kotlin+KTX

private lateinit var auth: FirebaseAuth
// ...
// Initialize Firebase Auth
auth = Firebase.auth
  1. 初始化 Activity 时,检查播放器是否已使用 Firebase 登录:

Java

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

Kotlin+KTX

override fun onStart() {
    super.onStart()
    // Check if user is signed in (non-null) and update UI accordingly.
    val currentUser = auth.currentUser
    updateUI(currentUser)
}
If the player isn't signed in, present the player with your game's
signed-out experience, including the option to sign in.
  1. 在玩家以静默方式或交互方式登录 Play 游戏后,从GoogleSignInAccount对象获取身份验证代码,将其交换为 Firebase 凭据,然后使用 Firebase 凭据向 Firebase 进行身份验证:

Java

// 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());

    final FirebaseAuth auth = FirebaseAuth.getInstance();
    AuthCredential credential = PlayGamesAuthProvider.getCredential(acct.getServerAuthCode());
    auth.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 = auth.getCurrentUser();
                        updateUI(user);
                    } else {
                        // If sign in fails, display a message to the user.
                        Log.w(TAG, "signInWithCredential:failure", task.getException());
                        Toast.makeText(MainActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                        updateUI(null);
                    }

                    // ...
                }
            });
}

Kotlin+KTX

// Call this both in the silent sign-in task's OnCompleteListener and in the
// Activity's onActivityResult handler.
private fun firebaseAuthWithPlayGames(acct: GoogleSignInAccount) {
    Log.d(TAG, "firebaseAuthWithPlayGames:" + acct.id!!)

    val auth = Firebase.auth
    val credential = PlayGamesAuthProvider.getCredential(acct.serverAuthCode!!)
    auth.signInWithCredential(credential)
            .addOnCompleteListener(this) { task ->
                if (task.isSuccessful) {
                    // Sign in success, update UI with the signed-in user's information
                    Log.d(TAG, "signInWithCredential:success")
                    val user = auth.currentUser
                    updateUI(user)
                } else {
                    // If sign in fails, display a message to the user.
                    Log.w(TAG, "signInWithCredential:failure", task.exception)
                    Toast.makeText(baseContext, "Authentication failed.",
                            Toast.LENGTH_SHORT).show()
                    updateUI(null)
                }

                // ...
            }
}

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

下一步

用户首次登录后,系统会创建一个新用户帐户并将其关联到他们的 Play 游戏 ID。这个新帐户存储为 Firebase 项目的一部分,可用于在项目中的每个应用中识别用户。

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

Java

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

Kotlin+KTX

val user = auth.currentUser
user?.let {
    val 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 FirebaseUser.getIdToken() instead.
    val uid = user.uid
}

在您的 Firebase 实时数据库和云存储安全规则中,您可以从auth变量中获取登录用户的唯一用户 ID,并使用它来控制用户可以访问哪些数据。

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

要注销用户,请调用FirebaseAuth.signOut()

Java

FirebaseAuth.getInstance().signOut();

Kotlin+KTX

Firebase.auth.signOut()