安卓基于 FirebaseAuth 實現 google 登錄
文章目錄
- 安卓基于 FirebaseAuth 實現 google 登錄
- 1. 前期準備
- 1.1 創建 Firebase 項目
- 1.2 將 Android 應用連接到 Firebase
- 1.3 在 Firebase 控制臺中啟用 Google 登錄
- 2. 在 Android 應用中實現 Google 登錄
- 2.1 初始化 GoogleSignInClient
- 2.2 啟動 Google 登錄流程
- 2.3 處理登錄結果
- 2.4 處理用戶狀態變化(可選但推薦)
- 2.5 退出登錄
- 3. 注意事項和最佳實踐
本文首發地址 https://h89.cn/archives/414.html
在 Android 應用中基于 Firebase Authentication 實現 Google 登錄是一個非常常見的需求,因為它簡化了用戶認證流程,并利用了 Google 強大的身份驗證基礎設施。下面我將詳細介紹整個實現過程。
1. 前期準備
1.1 創建 Firebase 項目
- 訪問 Firebase 控制臺: 訪問 Firebase Console。
- 創建新項目或選擇現有項目: 如果你還沒有 Firebase 項目,點擊“添加項目”并按照向導創建。如果你已有項目,選擇它。
1.2 將 Android 應用連接到 Firebase
-
在 Firebase 控制臺的項目概覽頁面,點擊 “將應用添加到 Firebase”,然后選擇 “Android” 圖標。
-
輸入 Android 包名: 輸入你的 Android 應用的包名(例如:
com.yourcompany.yourapp
)。這個包名必須與你build.gradle
文件中的applicationId
一致。 -
輸入 SHA-1 密鑰: SHA-1 指紋用于驗證你的應用與 Firebase 項目的關聯。
- 獲取 SHA-1: 在 Android Studio 中,打開 Gradle 面板(通常在右側),展開你的項目 -> Tasks -> android,雙擊
signingReport
。你會在 Run 窗口中看到 SHA-1 指紋。 - 將 SHA-1 復制并粘貼到 Firebase 控制臺。
- 獲取 SHA-1: 在 Android Studio 中,打開 Gradle 面板(通常在右側),展開你的項目 -> Tasks -> android,雙擊
-
下載
google-services.json
文件: 按照 Firebase 控制臺的指示下載google-services.json
文件,并將其放置到你的 Android 項目的app/
目錄下。 -
添加 Firebase SDK: 按照指示在你的
build.gradle
文件中添加必要的 Firebase SDK 依賴項。-
項目級別的
build.gradle
(<project>/build.gradle
):buildscript {repositories {google()mavenCentral()}dependencies {classpath 'com.android.tools.build:gradle:8.x.x' // 根據你的Android Studio版本調整classpath 'com.google.gms:google-services:4.x.x' // 最新版本} }allprojects {repositories {google()mavenCentral()} }
-
應用級別的
build.gradle
(<project>/app/build.gradle
):plugins {id 'com.android.application'id 'com.google.gms.google-services' // 添加這一行 }android {// ... }dependencies {// ...implementation(platform("com.google.firebase:firebase-bom:33.x.x")) // 最新版本implementation("com.google.firebase:firebase-auth")implementation("com.google.android.gms:play-services-auth:21.x.x") // Google Sign-In SDK }
-
同步項目: 修改完
build.gradle
文件后,同步你的 Android 項目。
-
1.3 在 Firebase 控制臺中啟用 Google 登錄
- 在 Firebase 控制臺,點擊左側菜單的 “Authentication”。
- 選擇 “Sign-in method” 標簽頁。
- 找到 “Google” 提供商,點擊它。
- 啟用 Google 登錄,然后點擊 “保存”。
- 重要提示: 在這里,你需要確保已經有一個“Web 客戶端(Web application)”類型的 OAuth 2.0 客戶端 ID。Firebase 會自動為你的項目生成一個,但如果你在 Google Cloud Console 中手動創建過項目,可能需要檢查。這個 Web 客戶端 ID 是用于后端服務器與 Google 認證服務通信的,不是你的 Android 客戶端 ID。
2. 在 Android 應用中實現 Google 登錄
2.1 初始化 GoogleSignInClient
在你的 Activity 或 Fragment 中,首先需要初始化 GoogleSignInClient
對象。這個對象用于啟動 Google 登錄流程。
// Kotlin
import com.google.android.gms.auth.api.signin.GoogleSignIn
import com.google.android.gms.auth.api.signin.GoogleSignInClient
import com.google.android.gms.auth.api.signin.GoogleSignInOptions
import com.google.firebase.auth.FirebaseAuthclass MainActivity : AppCompatActivity() {private lateinit var googleSignInClient: GoogleSignInClientprivate lateinit var firebaseAuth: FirebaseAuthoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 配置 Google Sign In 以請求用戶的 ID、電子郵件地址以及 ID 令牌val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestIdToken(getString(R.string.default_web_client_id)) // 這里很重要,需要 Web 客戶端 ID.requestEmail().build()googleSignInClient = GoogleSignIn.getClient(this, gso)firebaseAuth = FirebaseAuth.getInstance()// ... 其他初始化代碼}
}
關于 default_web_client_id
:
這個 ID 可以在 google-services.json
文件中找到,它通常位于 client
數組中,client_type
為 3 的對象的 oauth_client
數組下的 client_id
。或者,你也可以在 Firebase 控制臺的 項目設置 -> 通用 頁面中找到它(通常以 .apps.googleusercontent.com
結尾)。在 strings.xml
中定義它:
<resources><string name="default_web_client_id" translatable="false">YOUR_WEB_CLIENT_ID_FROM_FIREBASE</string>
</resources>
關于requestIdToken
如果去掉 requestIdToken ,可以實現通過 Google 登錄
需要在 https://console.cloud.google.com 添加賬戶配置,不需要 Firebase 平臺,
2.2 啟動 Google 登錄流程
通常,你會通過一個按鈕(例如“使用 Google 登錄”按鈕)來觸發登錄流程。
// Kotlin
// 在你的 onCreate 或其他適當位置為按鈕設置點擊監聽器
signInButton.setOnClickListener {signInWithGoogle()
}private fun signInWithGoogle() {val signInIntent = googleSignInClient.signInIntentstartActivityForResult(signInIntent, RC_SIGN_IN) // RC_SIGN_IN 是你定義的請求碼
}companion object {private const val RC_SIGN_IN = 9001 // 請求碼,任意整數即可
}
2.3 處理登錄結果
在 onActivityResult
方法中,你需要處理 Google 登錄的結果,并將其傳遞給 Firebase Authentication。
// Kotlin
import com.google.android.gms.auth.api.signin.GoogleSignIn
import com.google.android.gms.auth.api.signin.GoogleSignInAccount
import com.google.android.gms.common.api.ApiException
import com.google.firebase.auth.GoogleAuthProvideroverride fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {super.onActivityResult(requestCode, resultCode, data)// 檢查請求碼是否是 Google Sign-In 的請求碼if (requestCode == RC_SIGN_IN) {val task = GoogleSignIn.getSignedInAccountFromIntent(data)try {// Google Sign In 成功,現在使用 Google 賬戶向 Firebase 驗證val account = task.getResult(ApiException::class.java)Log.d(TAG, "Google sign-in successful: account.idToken=${account.idToken}")firebaseAuthWithGoogle(account.idToken!!)} catch (e: ApiException) {// Google Sign In 失敗,更新 UI 或顯示錯誤信息Log.w(TAG, "Google sign-in failed", e)Toast.makeText(this, "Google 登錄失敗:${e.message}", Toast.LENGTH_SHORT).show()}}
}private fun firebaseAuthWithGoogle(idToken: String) {Log.d(TAG, "firebaseAuthWithGoogle:$idToken")val credential = GoogleAuthProvider.getCredential(idToken, null)firebaseAuth.signInWithCredential(credential).addOnCompleteListener(this) { task ->if (task.isSuccessful) {// 登錄成功Log.d(TAG, "Firebase Google 登錄成功")val user = firebaseAuth.currentUserupdateUI(user) // 更新 UI,例如跳轉到主頁} else {// 登錄失敗Log.w(TAG, "Firebase Google 登錄失敗", task.exception)Toast.makeText(this, "Firebase Google 登錄失敗:${task.exception?.message}", Toast.LENGTH_SHORT).show()updateUI(null)}}
}private fun updateUI(user: FirebaseUser?) {if (user != null) {// 用戶已登錄,可以跳轉到主頁Toast.makeText(this, "歡迎, ${user.displayName ?: user.email}", Toast.LENGTH_SHORT).show()// 例如:startActivity(Intent(this, HomeActivity::class.java))// finish()} else {// 用戶未登錄,保持在登錄界面Toast.makeText(this, "請登錄", Toast.LENGTH_SHORT).show()}
}
2.4 處理用戶狀態變化(可選但推薦)
你可以在 Activity 的 onStart()
方法中檢查用戶是否已登錄。
// Kotlin
import com.google.firebase.auth.FirebaseUseroverride fun onStart() {super.onStart()// 檢查用戶是否已登錄 (非空) 并更新 UIval currentUser = firebaseAuth.currentUserupdateUI(currentUser)
}
2.5 退出登錄
// Kotlin
private fun signOut() {firebaseAuth.signOut() // Firebase 退出登錄googleSignInClient.signOut().addOnCompleteListener(this) {// Google 退出登錄成功updateUI(null)Toast.makeText(this, "已退出登錄", Toast.LENGTH_SHORT).show()}
}
3. 注意事項和最佳實踐
- 錯誤處理: 在實際應用中,你需要對
ApiException
和addOnCompleteListener
中的task.exception
進行更詳細的錯誤處理,向用戶提供有用的反饋。 - UI 更新:
updateUI()
方法是一個占位符,你需要根據你的應用邏輯來實現它。例如,當用戶登錄成功時,你可以導航到主屏幕;當用戶注銷時,可以返回登錄屏幕。 - 安全性:
- SHA-1 指紋: 確保你提供給 Firebase 的 SHA-1 指紋是正確的。如果你使用了發布版簽名,你還需要為發布版簽名配置一個 SHA-1 指紋。
default_web_client_id
: 確保你使用了正確的 Web 客戶端 ID。- 混淆: 如果你的應用使用了 ProGuard 或 R8 進行代碼混淆,請確保添加了必要的規則以保留 Firebase Authentication 和 Google Sign-In SDK 的類。通常,這些規則在庫中已經定義好了,但在某些情況下你可能需要手動添加。
- 用戶體驗:
- 提供清晰的登錄/注冊按鈕。
- 在登錄過程中顯示加載指示器,避免用戶誤以為應用無響應。
- 當登錄失敗時,向用戶提供明確的錯誤信息。
- Credential Manager (Android 14+): 對于 Android 14 及更高版本,Google 推薦使用 Credential Manager 來簡化和統一身份驗證流程,它也可以與 Firebase Authentication 結合使用。Credential Manager 提供更現代的 API 來處理各種憑據類型,包括 Google Sign-In。如果你支持 Android 14+,建議研究 Credential Manager。
通過遵循以上步驟,你就可以在你的 Android 應用中成功實現基于 Firebase Authentication 的 Google 登錄功能。這個方案既安全又方便,能夠為你的用戶提供流暢的認證體驗。
https://g.co/gemini/share/ae53a923579e