安卓基于 FirebaseAuth 實現 google 登錄

安卓基于 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 項目

  1. 訪問 Firebase 控制臺: 訪問 Firebase Console。
  2. 創建新項目或選擇現有項目: 如果你還沒有 Firebase 項目,點擊“添加項目”并按照向導創建。如果你已有項目,選擇它。

1.2 將 Android 應用連接到 Firebase

  1. 在 Firebase 控制臺的項目概覽頁面,點擊 “將應用添加到 Firebase”,然后選擇 “Android” 圖標。

  2. 輸入 Android 包名: 輸入你的 Android 應用的包名(例如:com.yourcompany.yourapp)。這個包名必須與你 build.gradle 文件中的 applicationId 一致。

  3. 輸入 SHA-1 密鑰: SHA-1 指紋用于驗證你的應用與 Firebase 項目的關聯。

    • 獲取 SHA-1: 在 Android Studio 中,打開 Gradle 面板(通常在右側),展開你的項目 -> Tasks -> android,雙擊 signingReport。你會在 Run 窗口中看到 SHA-1 指紋。
    • 將 SHA-1 復制并粘貼到 Firebase 控制臺。
  4. 下載 google-services.json 文件: 按照 Firebase 控制臺的指示下載 google-services.json 文件,并將其放置到你的 Android 項目的 app/ 目錄下。

  5. 添加 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 登錄

  1. 在 Firebase 控制臺,點擊左側菜單的 “Authentication”
  2. 選擇 “Sign-in method” 標簽頁。
  3. 找到 “Google” 提供商,點擊它。
  4. 啟用 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. 注意事項和最佳實踐

  • 錯誤處理: 在實際應用中,你需要對 ApiExceptionaddOnCompleteListener 中的 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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/88874.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/88874.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/88874.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

李宏毅(Deep Learning)--(三)

一.前向傳播與反向傳播的理解&#xff1a;二.模型訓練遇到的問題在模型訓練中&#xff0c;我們可能會遇到效果不好的情況&#xff0c;那么我們應該怎么思考切入&#xff0c;找到問題所在呢&#xff1f;流程圖如下&#xff1a;第一個就是去看訓練的損失函數值情況。如果損失較大…

android studio 運行,偶然會導致死機,設置Memory Settings嘗試解決

1、android studio導致死機 鼠標不能動&#xff0c;鍵盤沒有反應&#xff0c;只能硬重啟&#xff0c;但是內存并沒有用完&#xff0c;cpu也不是100% 2、可能的原因 android studio內存設置的問題&#xff0c;為了限制占用內存&#xff0c;所以手工設置內存最小的一個&#x…

HTB 賽季8靶場 - Outbound

Rustscan掃描我們開局便擁有賬號 tyler / LhKL1o9Nm3X2&#xff0c;我們使用rustscan進行掃描 rustscan -a 10.10.11.77 --range 1-65535 --scan-order "Random" -- -A Web服務漏洞探查 我們以賬號tyler / LhKL1o9Nm3X2登錄webmail&#xff0c;并快速確認版本信息。該…

動態組件和插槽

[Vue2]動態組件和插槽 動態組件和插槽來實現外部傳入自定義渲染 組件 <template><!-- 回復的處理進度 --><div v-if"steps.length > 0" class"gain-box-header"><el-steps direction"vertical"><div class"l…

Unreal5從入門到精通之如何實現UDP Socket通訊

文章目錄 一.前言二.什么是FSocket1. FSocket的作用2. FSocket關鍵特性三.創建Socket四.數據傳輸五.線程安全六.UDPSocketComponentUDPSocketComponent.hUUDPSocketComponent.cpp七.SocketTest測試八.最后一.前言 我們在開發UE 的過程中,會經常使用到Socket通訊,包括TCP,UD…

UI前端大數據處理新趨勢:基于邊緣計算的數據處理與響應

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;前端大數據的 “云端困境” 與邊緣計算的破局當用戶在在線文檔中實時協作…

Reading and Writing to a State Variable

本節是《Solidity by Example》的中文翻譯與深入講解&#xff0c;專為零基礎或剛接觸區塊鏈開發的小白朋友打造。我們將通過“示例 解說 提示”的方式&#xff0c;帶你逐步理解每一段 Solidity 代碼的實際用途與背后的邏輯。Solidity 是以太坊等智能合約平臺使用的主要編程語…

c# 深度解析:實現一個通用配置管理功能,打造高并發、可擴展的配置管理神器

文章目錄深入分析 ConfigManager<TKey, TValue> 類1. 類設計概述2. 核心成員分析2.1 字段和屬性2.2 構造函數3. 數據加載機制4. CRUD 操作方法4.1 添加數據4.2 刪除數據4.3 更新數據4.4 查詢數據4.5 清空數據5. 數據持久化6. 設計亮點7. 使用示例ConfigManager<TKey, …

運維打鐵: Python 腳本在運維中的常用場景與實現

文章目錄引言思維導圖常用場景與代碼實現1. 服務器監控2. 文件管理3. 網絡管理4. 自動化部署總結注意事項引言 在當今的 IT 運維領域&#xff0c;自動化和效率是至關重要的。Python 作為一種功能強大且易于學習的編程語言&#xff0c;已經成為運維人員不可或缺的工具。它可以幫…

【零基礎入門unity游戲開發——unity3D篇】3D光源之——unity反射和反射探針技術

文章目錄 前言實現天空盒反射1、新建一個cube2、全反射材質3、增加環境反射分辨率反射探針1、一樣把小球材質調成全反射2、在小球身上加添加反射探針3、設置靜態物體4、點擊烘培5、效果6、可以修改反射探針區域大小7、實時反射專欄推薦完結前言 當對象收到直接和間接光照后,它…

React Three Fiber 實現 3D 模型點擊高亮交互的核心技巧

在 WebGL 3D 開發中&#xff0c;模型交互是提升用戶體驗的關鍵功能之一。本文將基于 React Three Fiber&#xff08;R3F&#xff09;和 Three.js&#xff0c;總結 3D 模型點擊高亮&#xff08;包括模型本身和邊框&#xff09;的核心技術技巧&#xff0c;幫助開發者快速掌握復雜…

卷積神經網絡實戰:MNIST手寫數字識別

夜漸深&#xff0c;我還在&#x1f618; 老地方 睡覺了&#x1f64c; 文章目錄&#x1f4da; 卷積神經網絡實戰&#xff1a;MNIST手寫數字識別&#x1f9e0; 4.1 預備知識?? 4.1.1 torch.nn.Conv2d() 三維卷積操作&#x1f4cf; 4.1.2 nn.MaxPool2d() 池化層的作用&#x1f4…

HarmonyOS應用無響應(AppFreeze)深度解析:從檢測原理到問題定位

HarmonyOS應用無響應&#xff08;AppFreeze&#xff09;深度解析&#xff1a;從檢測原理到問題定位 在日常應用使用中&#xff0c;我們常會遇到點擊無反應、界面卡頓甚至完全卡死的情況——這些都可能是應用無響應&#xff08;AppFreeze&#xff09; 導致的。對于開發者而言&am…

湖北設立100億元人形機器人產業投資母基金

湖北設立100億元人形機器人產業投資母基金 湖北工信 2025年07月08日 12:03 湖北 &#xff0c;時長01:20 近日&#xff0c;湖北設立100億元人形機器人產業投資母基金&#xff0c;重點支持人形機器人和人工智能相關產業發展。 人形機器人產業投資母基金由湖北省財政廳依托省政府…

時序預測 | Pytorch實現CNN-LSTM-KAN電力負荷時間序列預測模型

預測效果 代碼主要功能 該代碼實現了一個結合CNN&#xff08;卷積神經網絡&#xff09;、LSTM&#xff08;長短期記憶網絡&#xff09;和KAN&#xff08;Kolmogorov-Arnold Network&#xff09;的混合模型&#xff0c;用于時間序列預測任務。主要流程包括&#xff1a; 數據加…

OCR 識別:車牌識別相機的 “火眼金睛”

車牌識別相機在交通管理、停車場收費等場景中&#xff0c;需快速準確識別車牌信息。但實際環境中&#xff0c;車牌可能存在污漬、磨損、光照不均等情況&#xff0c;傳統識別方式易出現誤讀、漏讀。OCR 技術讓車牌識別相機如虎添翼。它能精準提取車牌上的字符&#xff0c;不管是…

Java面試基礎:面向對象(2)

1. 接口里可以定義哪些方法抽象方法&#xff1a;抽象方法是接口的核心部分&#xff0c;所有實現接口的類都必須實現這些方法。抽象方法默認是 public 和 abstract 修飾&#xff0c;這些修飾符可以省略。public interface Animal {void Sound(); }默認方法&#xff1a;默認方法是…

有哪些更加簡潔的for循環?循環語句?

目錄 簡潔的for循環 循環過程修改循環變量 循環語句 不同編程語言支持的循環語句 foreach 無限循環 for循環歷史 break和continue 循環判斷結束值 循環標簽 循環語句優化 循環表達式返回值 簡潔的for循環 如果需要快速枚舉一個集合的元素&#xff0c;盡管C語言可以…

RK3568/3588 Android 12 源碼默認使用藍牙mic錄音

遇到客戶一個需求&#xff0c;如果連接了帶mic的藍牙耳機&#xff0c;默認所有的錄音要走藍牙mic通道。這個功能搞了好久&#xff0c;終于搞定了。1. 向RK尋求幫助&#xff0c;先打通 bt sco能力。此時&#xff0c;還無法默認就切換到藍牙 mic通道&#xff0c;接下來我們需求默…

解鎖HTTP:從理論到實戰的奇妙之旅

目錄一、HTTP 協議基礎入門1.1 HTTP 協議是什么1.2 HTTP 協議的特點1.3 HTTP 請求與響應的結構二、HTTP 應用場景大揭秘2.1 網頁瀏覽2.2 API 調用2.3 文件傳輸2.4 內容分發網絡&#xff08;CDN&#xff09;2.5 流媒體服務三、HTTP 應用實例深度剖析3.1 使用 JavaScript 的 fetc…