### 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






- 開啟 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 無其他變化
---
### 加入相依套件

- 在 App 模組的 build.gradle 中加入 Google Play Services SDK
- 加入 Credential Manager 的最新版本套件
### Adding dependencies

- 為了部署到正式環境,需要在模組的 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 結構元件。