### Intro - 教學主題為在 Android App 中使用 Firebase Authentication 和 Credential Manager 實作 Google 登入功能 - 範例為 Jetpack Compose 製作的筆記 App,程式碼已開源在 GitHub - 進入程式碼前會先介紹 Credential Manager、Firebase Authentication 及 Google 登入流程 --- ### Sample App - 範例 App 名為 Notes,筆記儲存在 Cloud Firestore 並顯示在主畫面 - 使用者可檢視、編輯、刪除自己的筆記 - 訪客可透過帳號中心進行登入或註冊 - 支援 Email/Password 和 Google 登入方式 - 登入後自動導回主畫面並載入使用者資料 --- ### Enabling sign-in method in the Firebase console ![image](https://hackmd.io/_uploads/SkyWqw4Tyg.png) ![image](https://hackmd.io/_uploads/ByYZcv4TJe.png) ![image](https://hackmd.io/_uploads/HJdr9wE6Jx.png) ![image](https://hackmd.io/_uploads/Bk58qDNTyg.png) ![image](https://hackmd.io/_uploads/HyHO5wVpJx.png) ![image](https://hackmd.io/_uploads/HJn2cPN6Jg.png) - 開啟 Firebase Console,進入 Authentication > Sign-in method - 新增 Provider 選擇 Google,需提供 SHA-1 指紋 - 若使用 Play App Signing,SHA-1 可在 Google Play Console 的 App Integrity 頁面取得 - 若未使用 Play App Signing,可在 Android Studio 中透過 signingReport 取得 debug keystore 的 SHA-1 - 回到 Firebase 專案設定頁,將 SHA-1 加入指定 Android App - 回到 Authentication 頁面啟用 Google 登入,填寫專案名稱與支援信箱 - 儲存設定後下載更新後的 google-services.json - 將檔案放至 App 模組根目錄,並確認檔名為 google-services.json 無其他變化 --- ### 加入相依套件 ![image](https://hackmd.io/_uploads/HkviqvVp1l.png) - 在 App 模組的 build.gradle 中加入 Google Play Services SDK - 加入 Credential Manager 的最新版本套件 ### Adding dependencies ![image](https://hackmd.io/_uploads/By2pqPVayg.png) - 為了部署到正式環境,需要在模組的 Proguard 規則檔中加入對 Play Services 的保護設定 - 設定完成後即可開始實作 Credential Manager 的 UI --- ### Credential Manager 的認證流程 - Credential Manager 有兩種登入流程:主動顯示底部選單流程、點擊登入按鈕流程 - 底部選單流程會在開啟登入畫面時自動顯示 - 按鈕流程則是使用者點選「使用 Google 登入」按鈕時觸發 - 兩種流程會產生不同的請求與設定 - 可參考 Notes App 中的 credentials extension 檔案查看相關設定 --- ### 使用 Firebase Authentication 登入 - 當從 Credential Manager 取得使用者憑證後,需確認憑證類型為 Google ID token credential - 若符合,使用此憑證建立 ID token - 接著使用 Google OAuth provider 建立 Firebase 所需的 credential 物件 - 最後使用 FirebaseAuth 的 signInWithCredential 完成登入 --- ### 匿名登入與帳號連結 - Firebase 支援匿名登入,可讓使用者先以訪客身份使用 App - 使用者日後若選擇登入 Google,可透過帳號連結功能將訪客帳號與 Google 帳號整合 - 帳號連結後,原匿名帳號的資料會保留並轉移至 Google 帳號 --- ### 使用 Firebase Authentication 註冊 - Notes App 中的註冊畫面也支援「使用 Google 註冊」按鈕 - 流程與登入畫面相同,都是選擇 Google 帳號並建立憑證 - 不同之處在於這裡是透過取得匿名使用者後,執行帳號連結操作 --- ### Demo 展示 - 使用者可從主畫面進入帳號中心,點選「Authenticate」進入登入畫面 - Credential Manager 自動顯示可用的 Google 帳號供選擇 - 登入後返回主畫面,可新增筆記並儲存 - 登出後筆記不再顯示,再次登入可重新取得資料 - 若使用者關閉 Credential Manager 對話框,可透過「使用 Google 登入」按鈕再次觸發流程 --- ### What’s next - Firebase 支援多種登入方式,可依需求擴充應用 - 可進一步探索 Firebase 的其他服務與功能 - 推薦訂閱 Firebase 官方 YouTube 頻道,觀看 Firebase Fundamental 系列影片 # Terminology - Firebase Authentication:Google 提供的後端服務,用來簡化應用程式中的使用者身份驗證流程。 - Credential Manager:Android 提供的 API,用來簡化與統一使用者憑證管理。 - Google Sign-In:讓使用者可以透過 Google 帳戶登入應用程式的身份驗證機制。 - Jetpack Compose:Android 的現代化 UI 工具包,用於以宣告式方式構建介面。 - SH1 Fingerprint:應用簽章所產生的 20 位元組雜湊,用於識別應用身份。 - Google Services JSON:Firebase 設定檔案,包含用戶端 API 金鑰與 OAuth 設定。 - Gradle:Android 專案的建構工具,負責依賴管理與建構流程。 - Debug Keystore:Android Studio 自動產生的測試用簽章憑證。 - Play App Signing:Google Play 提供的正式版應用自動簽章服務。 - Firebase Console:管理 Firebase 專案的線上圖形介面。 - Authentication Provider:第三方登入服務提供者,例如 Google、Facebook 等。 - OAuth 2.0 Client ID:授權流程中用來識別應用的憑證。 - Support Email:使用者遇到帳號問題時聯繫的支援電子信箱。 - Account Center:應用程式內顯示使用者帳號資訊的集中管理介面。 - Guest User:尚未登入的使用者,以匿名方式使用應用功能。 - Sign-in Flow:引導使用者完成身份驗證的整體流程。 - Cloud Firestore:Firebase 提供的即時雲端 NoSQL 資料庫服務。 - Google Play Console:開發者管理應用程式上架與簽章設定的平台。 - Android Studio:官方推薦的 Android 開發工具。 - Gradle Signing Report:顯示應用簽章資訊的命令工具。 - Public Project Name:用戶面對應用時所看到的公開名稱。 - Credential Picker:提供使用者選擇登入帳戶的 UI 組件。 - One Tap Sign-In:Google 提供的單一步驟登入體驗。 - ID Token:在 OAuth 流程中回傳的使用者身份憑證。 - Access Token:用於代表使用者進行 API 呼叫的授權憑證。 - Firebase SDK:提供 Firebase 功能的開發套件。 - Dependency:在 Gradle 中引用的外部程式庫或模組。 - AndroidManifest.xml:定義 Android 應用程式基本結構與權限的設定檔。 - Compose Navigation:Jetpack Compose 的導航架構管理工具。 - AuthViewModel:負責管理身份驗證邏輯的 ViewModel 類別。 - Coroutine:Kotlin 中的非同步程式設計工具。 - LifecycleScope:與組件生命週期綁定的 Coroutine 執行範圍。 - GoogleIdToken:由 Google 簽發的 ID Token,用來識別使用者身份。 - FirebaseUser:Firebase 中表示登入使用者的物件。 - SignInClient:用來發起登入請求的 API 實體。 - BeginSignInRequest:Credential Manager 中設定登入需求的物件。 - FirebaseAuth:Firebase 驗證主 API,用於管理使用者狀態與動作。 - SignInCredential:從 Credential Manager 回傳的登入憑證資料。 - Task API:Firebase 與 Google Play Services 中常見的非同步作業處理方式。 - AuthCredential:Firebase 中代表憑證資料的抽象類別。 - GoogleAuthProvider:Firebase 提供的 Google 登入驗證支援類別。 - Exception Handling:用於處理登入過程中發生的錯誤。 - Compose UI State:Jetpack Compose 中以 state 管理 UI 顯示邏輯。 - MutableStateFlow:Kotlin Flow 中可變狀態資料流。 - Sealed Class:Kotlin 中用來表示有限型別集合的類別,用於狀態管理。 - Retrofit:常用於與 API 溝通的 HTTP 請求套件。 - Gson:JSON 與物件間轉換的工具。 - ViewModelScope:Kotlin Coroutine 執行的 ViewModel 專屬範圍。 - FirestoreRepository:封裝與 Firestore 溝通邏輯的資料層類別。 - UI Event:Jetpack Compose 中用來通知畫面互動或錯誤的事件類別。 - Scaffold:Jetpack Compose 提供的基礎 UI 結構元件。