转到控制台

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

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

准备工作

设置 Android 项目

  1. 将 Firebase 添加到您的 Android 项目(如果尚未添加)。
  2. 请务必在您的项目级 build.gradle 文件中的 buildscriptallprojects 部分添加 Google 的 Maven 代码库。
  3. 将 Android 版 Firebase 身份验证库的依赖项添加到您的模块(应用级)Gradle 文件(通常为 app/build.gradle):

    implementation 'com.google.firebase:firebase-auth:18.1.0'
    implementation 'com.google.android.gms:play-services-auth:17.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. 找到您项目的 Web 服务器客户端 ID 和客户端密钥。Web 服务器客户端 ID 可向 Google Play 身份验证服务器表明您的 Firebase 项目的身份。

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

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

    3. 登录方法标签页上,启用 Play 游戏登录服务提供方。您需要指定从 API 控制台中获得的您项目的 Web 服务器客户端 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

Java

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

Kotlin

val gso = 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 对象的共享实例:

Java

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

Kotlin

private lateinit var auth: FirebaseAuth// ...
// Initialize Firebase Auth
auth = FirebaseAuth.getInstance()
  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

public 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

// 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 = FirebaseAuth.getInstance()
    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

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 实时数据库和 Cloud Storage 安全规则中,您可以从 auth 变量中获取已登录用户的唯一用户 ID,然后用此 ID 来控制用户可以访问哪些数据。

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

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

Java

FirebaseAuth.getInstance().signOut();

Kotlin

FirebaseAuth.getInstance().signOut()