Catch up on everthing we announced at this year's Firebase Summit. Learn more

在 Android 上使用 Google Play 遊戲服務進行身份驗證

您可以使用 Google Play 遊戲服務讓玩家登錄基於 Firebase 的 Android 遊戲。要通過 Firebase 使用 Google Play 遊戲服務登錄,請首先使用 Google Play 遊戲登錄播放器,並在這樣做時請求 OAuth 2.0 身份驗證代碼。然後,通過授權碼來PlayGamesAuthProvider生成一個火力地堡憑證,您可以使用與火力地堡進行身份驗證。

在你開始之前

設置您的 Android 項目

  1. 如果你還沒有,添加火力地堡到您的Android項目

  2. 使用火力地堡Android的物料清單,聲明你的模塊(應用程序級)搖籃文件(通常為火力地堡認證的Android庫的依賴app/build.gradle )。

    此外,作為設置 Firebase 身份驗證的一部分,您需要將 Google Play 服務 SDK 添加到您的應用程序。

    爪哇

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:29.0.1')
    
        // Declare 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 declare the dependency for the Google Play services library and specify its version implementation 'com.google.android.gms:play-services-auth:19.2.0'
    }

    通過使用火力地堡Android的物料清單,您的應用程序將始終使用火力地堡的Android庫的兼容版本。

    (替代)聲明火力地堡庫依賴使用物料清單

    如果您選擇不使用 Firebase BoM,則必須在其依賴項行中指定每個 Firebase 庫版本。

    需要注意的是,如果你在你的應用程序使用多個火力地堡庫,我們強烈建議您使用的物料清單管理庫版本,以保證所有版本相互兼容。

    dependencies {
        // Declare 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.0.1'
    // Also declare the dependency for the Google Play services library and specify its version implementation 'com.google.android.gms:play-services-auth:19.2.0'
    }

    科特林+KTX

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:29.0.1')
    
        // Declare 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 declare the dependency for the Google Play services library and specify its version implementation 'com.google.android.gms:play-services-auth:19.2.0'
    }

    通過使用火力地堡Android的物料清單,您的應用程序將始終使用火力地堡的Android庫的兼容版本。

    (替代)聲明火力地堡庫依賴使用物料清單

    如果您選擇不使用 Firebase BoM,則必須在其依賴項行中指定每個 Firebase 庫版本。

    需要注意的是,如果你在你的應用程序使用多個火力地堡庫,我們強烈建議您使用的物料清單管理庫版本,以保證所有版本相互兼容。

    dependencies {
        // Declare 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.0.1'
    // Also declare the dependency for the Google Play services library and specify its version implementation 'com.google.android.gms:play-services-auth:19.2.0'
    }

設置您的 Firebase 項目

  1. 設定從您的遊戲的SHA-1指紋設置了火力地堡控制台的頁面。

    您可以使用gradle這個讓你簽名證書的SHA哈希signingReport命令:

    ./gradlew signingReport

  2. 啟用 Google Play 遊戲作為登錄提供商:

    1. 查找您項目的 Web 服務器客戶端 ID 和客戶端密鑰。 Web 服務器客戶端 ID 向 Google Play 身份驗證服務器標識您的 Firebase 項目。

      要找到這些值:

      1. 打開在你的火力地堡項目谷歌API控制台憑證頁。
      2. OAuth 2.0客戶端ID部分,打開Web客戶機(自動由谷歌服務創建)詳細信息頁面。此頁面列出了您的 Web 服務器客戶端 ID 和密碼。
    2. 然後,在火力地堡控制台,打開驗證部分。

    3. 登錄方法選項卡,選中Play遊戲登錄提供商。您將需要指定您的項目的 Web 服務器客戶端 ID 和客戶端密鑰,這是您從 API 控制台獲得的。

  1. 谷歌遊戲控制台,打開應用,或創建一個。

  2. 成魚養殖部分,點擊Play遊戲服務>設置和管理>配置

  3. 單擊是,我的遊戲已使用谷歌的API,從列表中選擇你的火力地堡項目的名稱,然後單擊使用

  4. 在Google Play遊戲服務配置頁面,點擊添加憑據

    1. 選擇遊戲服務器類型。
    2. OAuth客戶區域,選擇您的項目的Web客戶端ID。確保這與您在啟用 Play 遊戲登錄時指定的客戶端 ID 相同。
    3. 保存您的更改。
  5. 儘管如此Play遊戲服務配置頁面上,再次單擊添加憑據

    1. 選擇Android類型。
    2. OAuth客戶區域,選擇項目的Android客戶端ID。 (如果您沒有看到您的 Android 客戶端 ID,請確保您在 Firebase 控制台中設置了遊戲的 SHA-1 指紋。)
    3. 保存您的更改。
  6. 測試器頁面,添加誰需要能夠鬆開它的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();

科特林+KTX

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

你必須通過你的Web服務器客戶端ID到requestServerAuthCode方法。這是您在 Firebase 控制台中啟用 Play 遊戲登錄功能時提供的 ID。

使用 Firebase 進行身份驗證

將 Play 遊戲登錄添加到您的應用後,您需要設置 Firebase 以使用您在玩家成功登錄 Play 遊戲時獲得的 Google 帳戶憑據。

  1. 首先,在您登入活動的onCreate方法,得到的共享實例FirebaseAuth對象:

爪哇

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

科特林+KTX

private lateinit var auth: FirebaseAuth
// ...
// Initialize Firebase Auth
auth = Firebase.auth
  1. 初始化 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);
}

科特林+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. 在玩遊戲玩家的跡象要么悄無聲息或交互之後,您可以通過授權碼GoogleSignInAccount對象,換取一個火力地堡證書,並驗證使用火力地堡火力地堡的憑據:

爪哇

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

                    // ...
                }
            });
}

科特林+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 項目的一部分存儲,可用於識別項目中每個應用中的用戶。

在你的遊戲中,你可以從獲取用戶的UID火力地堡FirebaseUser對象:

爪哇

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

科特林+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
}

在你的火力地堡實時數據庫和雲存儲的安全規則,你可以得到簽署的,從用戶的唯一的用戶ID auth的變量,並用它來控制哪些數據的用戶可以訪問。

為了讓用戶的玩遊戲玩家信息或訪問Google Play遊戲服務,使用由提供的API谷歌玩遊戲SDK

要註銷用戶,調用FirebaseAuth.signOut()

爪哇

FirebaseAuth.getInstance().signOut();

科特林+KTX

Firebase.auth.signOut()